1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512DQVL,X86-AVX512-WIN 3; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512DQVL,X86-AVX512-LIN 4; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN 5; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN 6; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512DQ,X86-AVX512-WIN 7; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512DQ,X86-AVX512-LIN 8; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN 9; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN 10; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512-WIN,X86-AVX512F-WIN 11; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512-LIN,X86-AVX512F-LIN 12; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN 13; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN 14; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE-WIN,X86-SSE3-WIN 15; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE-LIN,X86-SSE3-LIN 16; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE3-WIN 17; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE3-LIN 18; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE-WIN,X86-SSE2-WIN 19; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE-LIN,X86-SSE2-LIN 20; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE2-WIN 21; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE2-LIN 22; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=-sse | FileCheck %s --check-prefix=X87-WIN 23; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=-sse | FileCheck %s --check-prefix=X87-LIN 24 25; Check that scalar FP conversions to signed and unsigned int64 are using 26; reasonable sequences, across platforms and target switches. 27; 28; The signed case is straight forward, and the tests here basically 29; ensure successful compilation (f80 with avx512 was broken at one point). 30; 31; For the unsigned case there are many possible sequences, so to avoid 32; a fragile test we just check for the presence of a few key instructions. 33; AVX512 on Intel64 can use vcvtts[ds]2usi directly for float and double. 34; Otherwise the sequence will involve an FP subtract (fsub, subss or subsd), 35; and a truncating conversion (cvtts[ds]2si, fisttp, or fnstcw+fist). When 36; both a subtract and fnstcw are needed, they can occur in either order. 37; 38; The interesting subtargets are AVX512F (vcvtts[ds]2usi), SSE3 (fisttp), 39; SSE2 (cvtts[ds]2si) and vanilla X87 (fnstcw+fist, 32-bit only). 40 41define i64 @f_to_u64(float %a) nounwind { 42; X86-AVX512DQVL-LABEL: f_to_u64: 43; X86-AVX512DQVL: # %bb.0: 44; X86-AVX512DQVL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 45; X86-AVX512DQVL-NEXT: vcvttps2uqq %xmm0, %xmm0 46; X86-AVX512DQVL-NEXT: vmovd %xmm0, %eax 47; X86-AVX512DQVL-NEXT: vpextrd $1, %xmm0, %edx 48; X86-AVX512DQVL-NEXT: retl 49; 50; X64-AVX512-LABEL: f_to_u64: 51; X64-AVX512: # %bb.0: 52; X64-AVX512-NEXT: vcvttss2usi %xmm0, %rax 53; X64-AVX512-NEXT: retq 54; 55; X86-AVX512DQ-LABEL: f_to_u64: 56; X86-AVX512DQ: # %bb.0: 57; X86-AVX512DQ-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 58; X86-AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 59; X86-AVX512DQ-NEXT: vmovd %xmm0, %eax 60; X86-AVX512DQ-NEXT: vpextrd $1, %xmm0, %edx 61; X86-AVX512DQ-NEXT: vzeroupper 62; X86-AVX512DQ-NEXT: retl 63; 64; X86-AVX512F-WIN-LABEL: f_to_u64: 65; X86-AVX512F-WIN: # %bb.0: 66; X86-AVX512F-WIN-NEXT: pushl %ebp 67; X86-AVX512F-WIN-NEXT: movl %esp, %ebp 68; X86-AVX512F-WIN-NEXT: andl $-8, %esp 69; X86-AVX512F-WIN-NEXT: subl $8, %esp 70; X86-AVX512F-WIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 71; X86-AVX512F-WIN-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 72; X86-AVX512F-WIN-NEXT: xorl %edx, %edx 73; X86-AVX512F-WIN-NEXT: vucomiss %xmm0, %xmm1 74; X86-AVX512F-WIN-NEXT: setbe %dl 75; X86-AVX512F-WIN-NEXT: kmovw %edx, %k1 76; X86-AVX512F-WIN-NEXT: vmovss %xmm1, %xmm1, %xmm1 {%k1} {z} 77; X86-AVX512F-WIN-NEXT: vsubss %xmm1, %xmm0, %xmm0 78; X86-AVX512F-WIN-NEXT: vmovss %xmm0, (%esp) 79; X86-AVX512F-WIN-NEXT: flds (%esp) 80; X86-AVX512F-WIN-NEXT: fisttpll (%esp) 81; X86-AVX512F-WIN-NEXT: shll $31, %edx 82; X86-AVX512F-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 83; X86-AVX512F-WIN-NEXT: movl (%esp), %eax 84; X86-AVX512F-WIN-NEXT: movl %ebp, %esp 85; X86-AVX512F-WIN-NEXT: popl %ebp 86; X86-AVX512F-WIN-NEXT: retl 87; 88; X86-AVX512F-LIN-LABEL: f_to_u64: 89; X86-AVX512F-LIN: # %bb.0: 90; X86-AVX512F-LIN-NEXT: subl $12, %esp 91; X86-AVX512F-LIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 92; X86-AVX512F-LIN-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 93; X86-AVX512F-LIN-NEXT: xorl %edx, %edx 94; X86-AVX512F-LIN-NEXT: vucomiss %xmm0, %xmm1 95; X86-AVX512F-LIN-NEXT: setbe %dl 96; X86-AVX512F-LIN-NEXT: kmovw %edx, %k1 97; X86-AVX512F-LIN-NEXT: vmovss %xmm1, %xmm1, %xmm1 {%k1} {z} 98; X86-AVX512F-LIN-NEXT: vsubss %xmm1, %xmm0, %xmm0 99; X86-AVX512F-LIN-NEXT: vmovss %xmm0, (%esp) 100; X86-AVX512F-LIN-NEXT: flds (%esp) 101; X86-AVX512F-LIN-NEXT: fisttpll (%esp) 102; X86-AVX512F-LIN-NEXT: shll $31, %edx 103; X86-AVX512F-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 104; X86-AVX512F-LIN-NEXT: movl (%esp), %eax 105; X86-AVX512F-LIN-NEXT: addl $12, %esp 106; X86-AVX512F-LIN-NEXT: retl 107; 108; X86-SSE3-WIN-LABEL: f_to_u64: 109; X86-SSE3-WIN: # %bb.0: 110; X86-SSE3-WIN-NEXT: pushl %ebp 111; X86-SSE3-WIN-NEXT: movl %esp, %ebp 112; X86-SSE3-WIN-NEXT: andl $-8, %esp 113; X86-SSE3-WIN-NEXT: subl $8, %esp 114; X86-SSE3-WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 115; X86-SSE3-WIN-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 116; X86-SSE3-WIN-NEXT: ucomiss %xmm0, %xmm1 117; X86-SSE3-WIN-NEXT: jbe LBB0_2 118; X86-SSE3-WIN-NEXT: # %bb.1: 119; X86-SSE3-WIN-NEXT: xorps %xmm1, %xmm1 120; X86-SSE3-WIN-NEXT: LBB0_2: 121; X86-SSE3-WIN-NEXT: subss %xmm1, %xmm0 122; X86-SSE3-WIN-NEXT: movss %xmm0, (%esp) 123; X86-SSE3-WIN-NEXT: flds (%esp) 124; X86-SSE3-WIN-NEXT: fisttpll (%esp) 125; X86-SSE3-WIN-NEXT: setbe %al 126; X86-SSE3-WIN-NEXT: movzbl %al, %edx 127; X86-SSE3-WIN-NEXT: shll $31, %edx 128; X86-SSE3-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 129; X86-SSE3-WIN-NEXT: movl (%esp), %eax 130; X86-SSE3-WIN-NEXT: movl %ebp, %esp 131; X86-SSE3-WIN-NEXT: popl %ebp 132; X86-SSE3-WIN-NEXT: retl 133; 134; X86-SSE3-LIN-LABEL: f_to_u64: 135; X86-SSE3-LIN: # %bb.0: 136; X86-SSE3-LIN-NEXT: subl $12, %esp 137; X86-SSE3-LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 138; X86-SSE3-LIN-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 139; X86-SSE3-LIN-NEXT: ucomiss %xmm0, %xmm1 140; X86-SSE3-LIN-NEXT: jbe .LBB0_2 141; X86-SSE3-LIN-NEXT: # %bb.1: 142; X86-SSE3-LIN-NEXT: xorps %xmm1, %xmm1 143; X86-SSE3-LIN-NEXT: .LBB0_2: 144; X86-SSE3-LIN-NEXT: subss %xmm1, %xmm0 145; X86-SSE3-LIN-NEXT: movss %xmm0, (%esp) 146; X86-SSE3-LIN-NEXT: flds (%esp) 147; X86-SSE3-LIN-NEXT: fisttpll (%esp) 148; X86-SSE3-LIN-NEXT: setbe %al 149; X86-SSE3-LIN-NEXT: movzbl %al, %edx 150; X86-SSE3-LIN-NEXT: shll $31, %edx 151; X86-SSE3-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 152; X86-SSE3-LIN-NEXT: movl (%esp), %eax 153; X86-SSE3-LIN-NEXT: addl $12, %esp 154; X86-SSE3-LIN-NEXT: retl 155; 156; X64-SSE-WIN-LABEL: f_to_u64: 157; X64-SSE-WIN: # %bb.0: 158; X64-SSE-WIN-NEXT: cvttss2si %xmm0, %rcx 159; X64-SSE-WIN-NEXT: movq %rcx, %rdx 160; X64-SSE-WIN-NEXT: sarq $63, %rdx 161; X64-SSE-WIN-NEXT: subss __real@5f000000(%rip), %xmm0 162; X64-SSE-WIN-NEXT: cvttss2si %xmm0, %rax 163; X64-SSE-WIN-NEXT: andq %rdx, %rax 164; X64-SSE-WIN-NEXT: orq %rcx, %rax 165; X64-SSE-WIN-NEXT: retq 166; 167; X64-SSE-LIN-LABEL: f_to_u64: 168; X64-SSE-LIN: # %bb.0: 169; X64-SSE-LIN-NEXT: cvttss2si %xmm0, %rcx 170; X64-SSE-LIN-NEXT: movq %rcx, %rdx 171; X64-SSE-LIN-NEXT: sarq $63, %rdx 172; X64-SSE-LIN-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 173; X64-SSE-LIN-NEXT: cvttss2si %xmm0, %rax 174; X64-SSE-LIN-NEXT: andq %rdx, %rax 175; X64-SSE-LIN-NEXT: orq %rcx, %rax 176; X64-SSE-LIN-NEXT: retq 177; 178; X86-SSE2-WIN-LABEL: f_to_u64: 179; X86-SSE2-WIN: # %bb.0: 180; X86-SSE2-WIN-NEXT: pushl %ebp 181; X86-SSE2-WIN-NEXT: movl %esp, %ebp 182; X86-SSE2-WIN-NEXT: andl $-8, %esp 183; X86-SSE2-WIN-NEXT: subl $16, %esp 184; X86-SSE2-WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 185; X86-SSE2-WIN-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 186; X86-SSE2-WIN-NEXT: ucomiss %xmm0, %xmm1 187; X86-SSE2-WIN-NEXT: jbe LBB0_2 188; X86-SSE2-WIN-NEXT: # %bb.1: 189; X86-SSE2-WIN-NEXT: xorps %xmm1, %xmm1 190; X86-SSE2-WIN-NEXT: LBB0_2: 191; X86-SSE2-WIN-NEXT: subss %xmm1, %xmm0 192; X86-SSE2-WIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 193; X86-SSE2-WIN-NEXT: setbe %al 194; X86-SSE2-WIN-NEXT: flds {{[0-9]+}}(%esp) 195; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 196; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 197; X86-SSE2-WIN-NEXT: orl $3072, %ecx # imm = 0xC00 198; X86-SSE2-WIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 199; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 200; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 201; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 202; X86-SSE2-WIN-NEXT: movzbl %al, %edx 203; X86-SSE2-WIN-NEXT: shll $31, %edx 204; X86-SSE2-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 205; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 206; X86-SSE2-WIN-NEXT: movl %ebp, %esp 207; X86-SSE2-WIN-NEXT: popl %ebp 208; X86-SSE2-WIN-NEXT: retl 209; 210; X86-SSE2-LIN-LABEL: f_to_u64: 211; X86-SSE2-LIN: # %bb.0: 212; X86-SSE2-LIN-NEXT: subl $20, %esp 213; X86-SSE2-LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 214; X86-SSE2-LIN-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 215; X86-SSE2-LIN-NEXT: ucomiss %xmm0, %xmm1 216; X86-SSE2-LIN-NEXT: jbe .LBB0_2 217; X86-SSE2-LIN-NEXT: # %bb.1: 218; X86-SSE2-LIN-NEXT: xorps %xmm1, %xmm1 219; X86-SSE2-LIN-NEXT: .LBB0_2: 220; X86-SSE2-LIN-NEXT: subss %xmm1, %xmm0 221; X86-SSE2-LIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 222; X86-SSE2-LIN-NEXT: setbe %al 223; X86-SSE2-LIN-NEXT: flds {{[0-9]+}}(%esp) 224; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 225; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 226; X86-SSE2-LIN-NEXT: orl $3072, %ecx # imm = 0xC00 227; X86-SSE2-LIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 228; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 229; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 230; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 231; X86-SSE2-LIN-NEXT: movzbl %al, %edx 232; X86-SSE2-LIN-NEXT: shll $31, %edx 233; X86-SSE2-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 234; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 235; X86-SSE2-LIN-NEXT: addl $20, %esp 236; X86-SSE2-LIN-NEXT: retl 237; 238; X87-WIN-LABEL: f_to_u64: 239; X87-WIN: # %bb.0: 240; X87-WIN-NEXT: pushl %ebp 241; X87-WIN-NEXT: movl %esp, %ebp 242; X87-WIN-NEXT: andl $-8, %esp 243; X87-WIN-NEXT: subl $16, %esp 244; X87-WIN-NEXT: flds 8(%ebp) 245; X87-WIN-NEXT: flds __real@5f000000 246; X87-WIN-NEXT: fucom %st(1) 247; X87-WIN-NEXT: fnstsw %ax 248; X87-WIN-NEXT: xorl %edx, %edx 249; X87-WIN-NEXT: # kill: def $ah killed $ah killed $ax 250; X87-WIN-NEXT: sahf 251; X87-WIN-NEXT: setbe %al 252; X87-WIN-NEXT: fldz 253; X87-WIN-NEXT: jbe LBB0_2 254; X87-WIN-NEXT: # %bb.1: 255; X87-WIN-NEXT: fstp %st(1) 256; X87-WIN-NEXT: fldz 257; X87-WIN-NEXT: LBB0_2: 258; X87-WIN-NEXT: fstp %st(0) 259; X87-WIN-NEXT: fsubrp %st, %st(1) 260; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 261; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 262; X87-WIN-NEXT: orl $3072, %ecx # imm = 0xC00 263; X87-WIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 264; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 265; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 266; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 267; X87-WIN-NEXT: movb %al, %dl 268; X87-WIN-NEXT: shll $31, %edx 269; X87-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 270; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 271; X87-WIN-NEXT: movl %ebp, %esp 272; X87-WIN-NEXT: popl %ebp 273; X87-WIN-NEXT: retl 274; 275; X87-LIN-LABEL: f_to_u64: 276; X87-LIN: # %bb.0: 277; X87-LIN-NEXT: subl $20, %esp 278; X87-LIN-NEXT: flds {{[0-9]+}}(%esp) 279; X87-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 280; X87-LIN-NEXT: fucom %st(1) 281; X87-LIN-NEXT: fnstsw %ax 282; X87-LIN-NEXT: xorl %edx, %edx 283; X87-LIN-NEXT: # kill: def $ah killed $ah killed $ax 284; X87-LIN-NEXT: sahf 285; X87-LIN-NEXT: setbe %al 286; X87-LIN-NEXT: fldz 287; X87-LIN-NEXT: jbe .LBB0_2 288; X87-LIN-NEXT: # %bb.1: 289; X87-LIN-NEXT: fstp %st(1) 290; X87-LIN-NEXT: fldz 291; X87-LIN-NEXT: .LBB0_2: 292; X87-LIN-NEXT: fstp %st(0) 293; X87-LIN-NEXT: fsubrp %st, %st(1) 294; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 295; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 296; X87-LIN-NEXT: orl $3072, %ecx # imm = 0xC00 297; X87-LIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 298; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 299; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 300; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 301; X87-LIN-NEXT: movb %al, %dl 302; X87-LIN-NEXT: shll $31, %edx 303; X87-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 304; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 305; X87-LIN-NEXT: addl $20, %esp 306; X87-LIN-NEXT: retl 307 %r = fptoui float %a to i64 308 ret i64 %r 309} 310 311define i64 @f_to_s64(float %a) nounwind { 312; X86-AVX512DQVL-LABEL: f_to_s64: 313; X86-AVX512DQVL: # %bb.0: 314; X86-AVX512DQVL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 315; X86-AVX512DQVL-NEXT: vcvttps2qq %xmm0, %xmm0 316; X86-AVX512DQVL-NEXT: vmovd %xmm0, %eax 317; X86-AVX512DQVL-NEXT: vpextrd $1, %xmm0, %edx 318; X86-AVX512DQVL-NEXT: retl 319; 320; X64-AVX512-LABEL: f_to_s64: 321; X64-AVX512: # %bb.0: 322; X64-AVX512-NEXT: vcvttss2si %xmm0, %rax 323; X64-AVX512-NEXT: retq 324; 325; X86-AVX512DQ-LABEL: f_to_s64: 326; X86-AVX512DQ: # %bb.0: 327; X86-AVX512DQ-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 328; X86-AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 329; X86-AVX512DQ-NEXT: vmovd %xmm0, %eax 330; X86-AVX512DQ-NEXT: vpextrd $1, %xmm0, %edx 331; X86-AVX512DQ-NEXT: vzeroupper 332; X86-AVX512DQ-NEXT: retl 333; 334; X86-AVX512F-WIN-LABEL: f_to_s64: 335; X86-AVX512F-WIN: # %bb.0: 336; X86-AVX512F-WIN-NEXT: pushl %ebp 337; X86-AVX512F-WIN-NEXT: movl %esp, %ebp 338; X86-AVX512F-WIN-NEXT: andl $-8, %esp 339; X86-AVX512F-WIN-NEXT: subl $8, %esp 340; X86-AVX512F-WIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 341; X86-AVX512F-WIN-NEXT: vmovss %xmm0, (%esp) 342; X86-AVX512F-WIN-NEXT: flds (%esp) 343; X86-AVX512F-WIN-NEXT: fisttpll (%esp) 344; X86-AVX512F-WIN-NEXT: movl (%esp), %eax 345; X86-AVX512F-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 346; X86-AVX512F-WIN-NEXT: movl %ebp, %esp 347; X86-AVX512F-WIN-NEXT: popl %ebp 348; X86-AVX512F-WIN-NEXT: retl 349; 350; X86-AVX512F-LIN-LABEL: f_to_s64: 351; X86-AVX512F-LIN: # %bb.0: 352; X86-AVX512F-LIN-NEXT: subl $12, %esp 353; X86-AVX512F-LIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 354; X86-AVX512F-LIN-NEXT: vmovss %xmm0, (%esp) 355; X86-AVX512F-LIN-NEXT: flds (%esp) 356; X86-AVX512F-LIN-NEXT: fisttpll (%esp) 357; X86-AVX512F-LIN-NEXT: movl (%esp), %eax 358; X86-AVX512F-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 359; X86-AVX512F-LIN-NEXT: addl $12, %esp 360; X86-AVX512F-LIN-NEXT: retl 361; 362; X86-SSE3-WIN-LABEL: f_to_s64: 363; X86-SSE3-WIN: # %bb.0: 364; X86-SSE3-WIN-NEXT: pushl %ebp 365; X86-SSE3-WIN-NEXT: movl %esp, %ebp 366; X86-SSE3-WIN-NEXT: andl $-8, %esp 367; X86-SSE3-WIN-NEXT: subl $8, %esp 368; X86-SSE3-WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 369; X86-SSE3-WIN-NEXT: movss %xmm0, (%esp) 370; X86-SSE3-WIN-NEXT: flds (%esp) 371; X86-SSE3-WIN-NEXT: fisttpll (%esp) 372; X86-SSE3-WIN-NEXT: movl (%esp), %eax 373; X86-SSE3-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 374; X86-SSE3-WIN-NEXT: movl %ebp, %esp 375; X86-SSE3-WIN-NEXT: popl %ebp 376; X86-SSE3-WIN-NEXT: retl 377; 378; X86-SSE3-LIN-LABEL: f_to_s64: 379; X86-SSE3-LIN: # %bb.0: 380; X86-SSE3-LIN-NEXT: subl $12, %esp 381; X86-SSE3-LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 382; X86-SSE3-LIN-NEXT: movss %xmm0, (%esp) 383; X86-SSE3-LIN-NEXT: flds (%esp) 384; X86-SSE3-LIN-NEXT: fisttpll (%esp) 385; X86-SSE3-LIN-NEXT: movl (%esp), %eax 386; X86-SSE3-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 387; X86-SSE3-LIN-NEXT: addl $12, %esp 388; X86-SSE3-LIN-NEXT: retl 389; 390; X64-SSE-LABEL: f_to_s64: 391; X64-SSE: # %bb.0: 392; X64-SSE-NEXT: cvttss2si %xmm0, %rax 393; X64-SSE-NEXT: retq 394; 395; X86-SSE2-WIN-LABEL: f_to_s64: 396; X86-SSE2-WIN: # %bb.0: 397; X86-SSE2-WIN-NEXT: pushl %ebp 398; X86-SSE2-WIN-NEXT: movl %esp, %ebp 399; X86-SSE2-WIN-NEXT: andl $-8, %esp 400; X86-SSE2-WIN-NEXT: subl $16, %esp 401; X86-SSE2-WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 402; X86-SSE2-WIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 403; X86-SSE2-WIN-NEXT: flds {{[0-9]+}}(%esp) 404; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 405; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 406; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 407; X86-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 408; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 409; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 410; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 411; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 412; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 413; X86-SSE2-WIN-NEXT: movl %ebp, %esp 414; X86-SSE2-WIN-NEXT: popl %ebp 415; X86-SSE2-WIN-NEXT: retl 416; 417; X86-SSE2-LIN-LABEL: f_to_s64: 418; X86-SSE2-LIN: # %bb.0: 419; X86-SSE2-LIN-NEXT: subl $20, %esp 420; X86-SSE2-LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 421; X86-SSE2-LIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 422; X86-SSE2-LIN-NEXT: flds {{[0-9]+}}(%esp) 423; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 424; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 425; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 426; X86-SSE2-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 427; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 428; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 429; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 430; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 431; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 432; X86-SSE2-LIN-NEXT: addl $20, %esp 433; X86-SSE2-LIN-NEXT: retl 434; 435; X87-WIN-LABEL: f_to_s64: 436; X87-WIN: # %bb.0: 437; X87-WIN-NEXT: pushl %ebp 438; X87-WIN-NEXT: movl %esp, %ebp 439; X87-WIN-NEXT: andl $-8, %esp 440; X87-WIN-NEXT: subl $16, %esp 441; X87-WIN-NEXT: flds 8(%ebp) 442; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 443; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 444; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 445; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 446; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 447; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 448; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 449; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 450; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 451; X87-WIN-NEXT: movl %ebp, %esp 452; X87-WIN-NEXT: popl %ebp 453; X87-WIN-NEXT: retl 454; 455; X87-LIN-LABEL: f_to_s64: 456; X87-LIN: # %bb.0: 457; X87-LIN-NEXT: subl $20, %esp 458; X87-LIN-NEXT: flds {{[0-9]+}}(%esp) 459; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 460; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 461; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 462; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 463; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 464; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 465; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 466; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 467; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 468; X87-LIN-NEXT: addl $20, %esp 469; X87-LIN-NEXT: retl 470 %r = fptosi float %a to i64 471 ret i64 %r 472} 473 474define i64 @d_to_u64(double %a) nounwind { 475; X86-AVX512DQVL-LABEL: d_to_u64: 476; X86-AVX512DQVL: # %bb.0: 477; X86-AVX512DQVL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 478; X86-AVX512DQVL-NEXT: vcvttpd2uqq %xmm0, %xmm0 479; X86-AVX512DQVL-NEXT: vmovd %xmm0, %eax 480; X86-AVX512DQVL-NEXT: vpextrd $1, %xmm0, %edx 481; X86-AVX512DQVL-NEXT: retl 482; 483; X64-AVX512-LABEL: d_to_u64: 484; X64-AVX512: # %bb.0: 485; X64-AVX512-NEXT: vcvttsd2usi %xmm0, %rax 486; X64-AVX512-NEXT: retq 487; 488; X86-AVX512DQ-LABEL: d_to_u64: 489; X86-AVX512DQ: # %bb.0: 490; X86-AVX512DQ-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 491; X86-AVX512DQ-NEXT: vcvttpd2uqq %zmm0, %zmm0 492; X86-AVX512DQ-NEXT: vmovd %xmm0, %eax 493; X86-AVX512DQ-NEXT: vpextrd $1, %xmm0, %edx 494; X86-AVX512DQ-NEXT: vzeroupper 495; X86-AVX512DQ-NEXT: retl 496; 497; X86-AVX512F-WIN-LABEL: d_to_u64: 498; X86-AVX512F-WIN: # %bb.0: 499; X86-AVX512F-WIN-NEXT: pushl %ebp 500; X86-AVX512F-WIN-NEXT: movl %esp, %ebp 501; X86-AVX512F-WIN-NEXT: andl $-8, %esp 502; X86-AVX512F-WIN-NEXT: subl $8, %esp 503; X86-AVX512F-WIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 504; X86-AVX512F-WIN-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 505; X86-AVX512F-WIN-NEXT: xorl %edx, %edx 506; X86-AVX512F-WIN-NEXT: vucomisd %xmm0, %xmm1 507; X86-AVX512F-WIN-NEXT: setbe %dl 508; X86-AVX512F-WIN-NEXT: kmovw %edx, %k1 509; X86-AVX512F-WIN-NEXT: vmovsd %xmm1, %xmm1, %xmm1 {%k1} {z} 510; X86-AVX512F-WIN-NEXT: vsubsd %xmm1, %xmm0, %xmm0 511; X86-AVX512F-WIN-NEXT: vmovsd %xmm0, (%esp) 512; X86-AVX512F-WIN-NEXT: fldl (%esp) 513; X86-AVX512F-WIN-NEXT: fisttpll (%esp) 514; X86-AVX512F-WIN-NEXT: shll $31, %edx 515; X86-AVX512F-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 516; X86-AVX512F-WIN-NEXT: movl (%esp), %eax 517; X86-AVX512F-WIN-NEXT: movl %ebp, %esp 518; X86-AVX512F-WIN-NEXT: popl %ebp 519; X86-AVX512F-WIN-NEXT: retl 520; 521; X86-AVX512F-LIN-LABEL: d_to_u64: 522; X86-AVX512F-LIN: # %bb.0: 523; X86-AVX512F-LIN-NEXT: subl $12, %esp 524; X86-AVX512F-LIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 525; X86-AVX512F-LIN-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 526; X86-AVX512F-LIN-NEXT: xorl %edx, %edx 527; X86-AVX512F-LIN-NEXT: vucomisd %xmm0, %xmm1 528; X86-AVX512F-LIN-NEXT: setbe %dl 529; X86-AVX512F-LIN-NEXT: kmovw %edx, %k1 530; X86-AVX512F-LIN-NEXT: vmovsd %xmm1, %xmm1, %xmm1 {%k1} {z} 531; X86-AVX512F-LIN-NEXT: vsubsd %xmm1, %xmm0, %xmm0 532; X86-AVX512F-LIN-NEXT: vmovsd %xmm0, (%esp) 533; X86-AVX512F-LIN-NEXT: fldl (%esp) 534; X86-AVX512F-LIN-NEXT: fisttpll (%esp) 535; X86-AVX512F-LIN-NEXT: shll $31, %edx 536; X86-AVX512F-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 537; X86-AVX512F-LIN-NEXT: movl (%esp), %eax 538; X86-AVX512F-LIN-NEXT: addl $12, %esp 539; X86-AVX512F-LIN-NEXT: retl 540; 541; X86-SSE3-WIN-LABEL: d_to_u64: 542; X86-SSE3-WIN: # %bb.0: 543; X86-SSE3-WIN-NEXT: pushl %ebp 544; X86-SSE3-WIN-NEXT: movl %esp, %ebp 545; X86-SSE3-WIN-NEXT: andl $-8, %esp 546; X86-SSE3-WIN-NEXT: subl $8, %esp 547; X86-SSE3-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 548; X86-SSE3-WIN-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 549; X86-SSE3-WIN-NEXT: ucomisd %xmm0, %xmm1 550; X86-SSE3-WIN-NEXT: jbe LBB2_2 551; X86-SSE3-WIN-NEXT: # %bb.1: 552; X86-SSE3-WIN-NEXT: xorpd %xmm1, %xmm1 553; X86-SSE3-WIN-NEXT: LBB2_2: 554; X86-SSE3-WIN-NEXT: subsd %xmm1, %xmm0 555; X86-SSE3-WIN-NEXT: movsd %xmm0, (%esp) 556; X86-SSE3-WIN-NEXT: fldl (%esp) 557; X86-SSE3-WIN-NEXT: fisttpll (%esp) 558; X86-SSE3-WIN-NEXT: setbe %al 559; X86-SSE3-WIN-NEXT: movzbl %al, %edx 560; X86-SSE3-WIN-NEXT: shll $31, %edx 561; X86-SSE3-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 562; X86-SSE3-WIN-NEXT: movl (%esp), %eax 563; X86-SSE3-WIN-NEXT: movl %ebp, %esp 564; X86-SSE3-WIN-NEXT: popl %ebp 565; X86-SSE3-WIN-NEXT: retl 566; 567; X86-SSE3-LIN-LABEL: d_to_u64: 568; X86-SSE3-LIN: # %bb.0: 569; X86-SSE3-LIN-NEXT: subl $12, %esp 570; X86-SSE3-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 571; X86-SSE3-LIN-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 572; X86-SSE3-LIN-NEXT: ucomisd %xmm0, %xmm1 573; X86-SSE3-LIN-NEXT: jbe .LBB2_2 574; X86-SSE3-LIN-NEXT: # %bb.1: 575; X86-SSE3-LIN-NEXT: xorpd %xmm1, %xmm1 576; X86-SSE3-LIN-NEXT: .LBB2_2: 577; X86-SSE3-LIN-NEXT: subsd %xmm1, %xmm0 578; X86-SSE3-LIN-NEXT: movsd %xmm0, (%esp) 579; X86-SSE3-LIN-NEXT: fldl (%esp) 580; X86-SSE3-LIN-NEXT: fisttpll (%esp) 581; X86-SSE3-LIN-NEXT: setbe %al 582; X86-SSE3-LIN-NEXT: movzbl %al, %edx 583; X86-SSE3-LIN-NEXT: shll $31, %edx 584; X86-SSE3-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 585; X86-SSE3-LIN-NEXT: movl (%esp), %eax 586; X86-SSE3-LIN-NEXT: addl $12, %esp 587; X86-SSE3-LIN-NEXT: retl 588; 589; X64-SSE-WIN-LABEL: d_to_u64: 590; X64-SSE-WIN: # %bb.0: 591; X64-SSE-WIN-NEXT: cvttsd2si %xmm0, %rcx 592; X64-SSE-WIN-NEXT: movq %rcx, %rdx 593; X64-SSE-WIN-NEXT: sarq $63, %rdx 594; X64-SSE-WIN-NEXT: subsd __real@43e0000000000000(%rip), %xmm0 595; X64-SSE-WIN-NEXT: cvttsd2si %xmm0, %rax 596; X64-SSE-WIN-NEXT: andq %rdx, %rax 597; X64-SSE-WIN-NEXT: orq %rcx, %rax 598; X64-SSE-WIN-NEXT: retq 599; 600; X64-SSE-LIN-LABEL: d_to_u64: 601; X64-SSE-LIN: # %bb.0: 602; X64-SSE-LIN-NEXT: cvttsd2si %xmm0, %rcx 603; X64-SSE-LIN-NEXT: movq %rcx, %rdx 604; X64-SSE-LIN-NEXT: sarq $63, %rdx 605; X64-SSE-LIN-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 606; X64-SSE-LIN-NEXT: cvttsd2si %xmm0, %rax 607; X64-SSE-LIN-NEXT: andq %rdx, %rax 608; X64-SSE-LIN-NEXT: orq %rcx, %rax 609; X64-SSE-LIN-NEXT: retq 610; 611; X86-SSE2-WIN-LABEL: d_to_u64: 612; X86-SSE2-WIN: # %bb.0: 613; X86-SSE2-WIN-NEXT: pushl %ebp 614; X86-SSE2-WIN-NEXT: movl %esp, %ebp 615; X86-SSE2-WIN-NEXT: andl $-8, %esp 616; X86-SSE2-WIN-NEXT: subl $16, %esp 617; X86-SSE2-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 618; X86-SSE2-WIN-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 619; X86-SSE2-WIN-NEXT: ucomisd %xmm0, %xmm1 620; X86-SSE2-WIN-NEXT: jbe LBB2_2 621; X86-SSE2-WIN-NEXT: # %bb.1: 622; X86-SSE2-WIN-NEXT: xorpd %xmm1, %xmm1 623; X86-SSE2-WIN-NEXT: LBB2_2: 624; X86-SSE2-WIN-NEXT: subsd %xmm1, %xmm0 625; X86-SSE2-WIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp) 626; X86-SSE2-WIN-NEXT: setbe %al 627; X86-SSE2-WIN-NEXT: fldl {{[0-9]+}}(%esp) 628; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 629; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 630; X86-SSE2-WIN-NEXT: orl $3072, %ecx # imm = 0xC00 631; X86-SSE2-WIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 632; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 633; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 634; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 635; X86-SSE2-WIN-NEXT: movzbl %al, %edx 636; X86-SSE2-WIN-NEXT: shll $31, %edx 637; X86-SSE2-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 638; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 639; X86-SSE2-WIN-NEXT: movl %ebp, %esp 640; X86-SSE2-WIN-NEXT: popl %ebp 641; X86-SSE2-WIN-NEXT: retl 642; 643; X86-SSE2-LIN-LABEL: d_to_u64: 644; X86-SSE2-LIN: # %bb.0: 645; X86-SSE2-LIN-NEXT: subl $20, %esp 646; X86-SSE2-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 647; X86-SSE2-LIN-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 648; X86-SSE2-LIN-NEXT: ucomisd %xmm0, %xmm1 649; X86-SSE2-LIN-NEXT: jbe .LBB2_2 650; X86-SSE2-LIN-NEXT: # %bb.1: 651; X86-SSE2-LIN-NEXT: xorpd %xmm1, %xmm1 652; X86-SSE2-LIN-NEXT: .LBB2_2: 653; X86-SSE2-LIN-NEXT: subsd %xmm1, %xmm0 654; X86-SSE2-LIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp) 655; X86-SSE2-LIN-NEXT: setbe %al 656; X86-SSE2-LIN-NEXT: fldl {{[0-9]+}}(%esp) 657; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 658; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 659; X86-SSE2-LIN-NEXT: orl $3072, %ecx # imm = 0xC00 660; X86-SSE2-LIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 661; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 662; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 663; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 664; X86-SSE2-LIN-NEXT: movzbl %al, %edx 665; X86-SSE2-LIN-NEXT: shll $31, %edx 666; X86-SSE2-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 667; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 668; X86-SSE2-LIN-NEXT: addl $20, %esp 669; X86-SSE2-LIN-NEXT: retl 670; 671; X87-WIN-LABEL: d_to_u64: 672; X87-WIN: # %bb.0: 673; X87-WIN-NEXT: pushl %ebp 674; X87-WIN-NEXT: movl %esp, %ebp 675; X87-WIN-NEXT: andl $-8, %esp 676; X87-WIN-NEXT: subl $16, %esp 677; X87-WIN-NEXT: fldl 8(%ebp) 678; X87-WIN-NEXT: flds __real@5f000000 679; X87-WIN-NEXT: fucom %st(1) 680; X87-WIN-NEXT: fnstsw %ax 681; X87-WIN-NEXT: xorl %edx, %edx 682; X87-WIN-NEXT: # kill: def $ah killed $ah killed $ax 683; X87-WIN-NEXT: sahf 684; X87-WIN-NEXT: setbe %al 685; X87-WIN-NEXT: fldz 686; X87-WIN-NEXT: jbe LBB2_2 687; X87-WIN-NEXT: # %bb.1: 688; X87-WIN-NEXT: fstp %st(1) 689; X87-WIN-NEXT: fldz 690; X87-WIN-NEXT: LBB2_2: 691; X87-WIN-NEXT: fstp %st(0) 692; X87-WIN-NEXT: fsubrp %st, %st(1) 693; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 694; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 695; X87-WIN-NEXT: orl $3072, %ecx # imm = 0xC00 696; X87-WIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 697; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 698; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 699; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 700; X87-WIN-NEXT: movb %al, %dl 701; X87-WIN-NEXT: shll $31, %edx 702; X87-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 703; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 704; X87-WIN-NEXT: movl %ebp, %esp 705; X87-WIN-NEXT: popl %ebp 706; X87-WIN-NEXT: retl 707; 708; X87-LIN-LABEL: d_to_u64: 709; X87-LIN: # %bb.0: 710; X87-LIN-NEXT: subl $20, %esp 711; X87-LIN-NEXT: fldl {{[0-9]+}}(%esp) 712; X87-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 713; X87-LIN-NEXT: fucom %st(1) 714; X87-LIN-NEXT: fnstsw %ax 715; X87-LIN-NEXT: xorl %edx, %edx 716; X87-LIN-NEXT: # kill: def $ah killed $ah killed $ax 717; X87-LIN-NEXT: sahf 718; X87-LIN-NEXT: setbe %al 719; X87-LIN-NEXT: fldz 720; X87-LIN-NEXT: jbe .LBB2_2 721; X87-LIN-NEXT: # %bb.1: 722; X87-LIN-NEXT: fstp %st(1) 723; X87-LIN-NEXT: fldz 724; X87-LIN-NEXT: .LBB2_2: 725; X87-LIN-NEXT: fstp %st(0) 726; X87-LIN-NEXT: fsubrp %st, %st(1) 727; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 728; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 729; X87-LIN-NEXT: orl $3072, %ecx # imm = 0xC00 730; X87-LIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 731; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 732; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 733; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 734; X87-LIN-NEXT: movb %al, %dl 735; X87-LIN-NEXT: shll $31, %edx 736; X87-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 737; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 738; X87-LIN-NEXT: addl $20, %esp 739; X87-LIN-NEXT: retl 740 %r = fptoui double %a to i64 741 ret i64 %r 742} 743 744define i64 @d_to_s64(double %a) nounwind { 745; X86-AVX512DQVL-LABEL: d_to_s64: 746; X86-AVX512DQVL: # %bb.0: 747; X86-AVX512DQVL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 748; X86-AVX512DQVL-NEXT: vcvttpd2qq %xmm0, %xmm0 749; X86-AVX512DQVL-NEXT: vmovd %xmm0, %eax 750; X86-AVX512DQVL-NEXT: vpextrd $1, %xmm0, %edx 751; X86-AVX512DQVL-NEXT: retl 752; 753; X64-AVX512-LABEL: d_to_s64: 754; X64-AVX512: # %bb.0: 755; X64-AVX512-NEXT: vcvttsd2si %xmm0, %rax 756; X64-AVX512-NEXT: retq 757; 758; X86-AVX512DQ-LABEL: d_to_s64: 759; X86-AVX512DQ: # %bb.0: 760; X86-AVX512DQ-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 761; X86-AVX512DQ-NEXT: vcvttpd2qq %zmm0, %zmm0 762; X86-AVX512DQ-NEXT: vmovd %xmm0, %eax 763; X86-AVX512DQ-NEXT: vpextrd $1, %xmm0, %edx 764; X86-AVX512DQ-NEXT: vzeroupper 765; X86-AVX512DQ-NEXT: retl 766; 767; X86-AVX512F-WIN-LABEL: d_to_s64: 768; X86-AVX512F-WIN: # %bb.0: 769; X86-AVX512F-WIN-NEXT: pushl %ebp 770; X86-AVX512F-WIN-NEXT: movl %esp, %ebp 771; X86-AVX512F-WIN-NEXT: andl $-8, %esp 772; X86-AVX512F-WIN-NEXT: subl $8, %esp 773; X86-AVX512F-WIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 774; X86-AVX512F-WIN-NEXT: vmovsd %xmm0, (%esp) 775; X86-AVX512F-WIN-NEXT: fldl (%esp) 776; X86-AVX512F-WIN-NEXT: fisttpll (%esp) 777; X86-AVX512F-WIN-NEXT: movl (%esp), %eax 778; X86-AVX512F-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 779; X86-AVX512F-WIN-NEXT: movl %ebp, %esp 780; X86-AVX512F-WIN-NEXT: popl %ebp 781; X86-AVX512F-WIN-NEXT: retl 782; 783; X86-AVX512F-LIN-LABEL: d_to_s64: 784; X86-AVX512F-LIN: # %bb.0: 785; X86-AVX512F-LIN-NEXT: subl $12, %esp 786; X86-AVX512F-LIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 787; X86-AVX512F-LIN-NEXT: vmovsd %xmm0, (%esp) 788; X86-AVX512F-LIN-NEXT: fldl (%esp) 789; X86-AVX512F-LIN-NEXT: fisttpll (%esp) 790; X86-AVX512F-LIN-NEXT: movl (%esp), %eax 791; X86-AVX512F-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 792; X86-AVX512F-LIN-NEXT: addl $12, %esp 793; X86-AVX512F-LIN-NEXT: retl 794; 795; X86-SSE3-WIN-LABEL: d_to_s64: 796; X86-SSE3-WIN: # %bb.0: 797; X86-SSE3-WIN-NEXT: pushl %ebp 798; X86-SSE3-WIN-NEXT: movl %esp, %ebp 799; X86-SSE3-WIN-NEXT: andl $-8, %esp 800; X86-SSE3-WIN-NEXT: subl $8, %esp 801; X86-SSE3-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 802; X86-SSE3-WIN-NEXT: movsd %xmm0, (%esp) 803; X86-SSE3-WIN-NEXT: fldl (%esp) 804; X86-SSE3-WIN-NEXT: fisttpll (%esp) 805; X86-SSE3-WIN-NEXT: movl (%esp), %eax 806; X86-SSE3-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 807; X86-SSE3-WIN-NEXT: movl %ebp, %esp 808; X86-SSE3-WIN-NEXT: popl %ebp 809; X86-SSE3-WIN-NEXT: retl 810; 811; X86-SSE3-LIN-LABEL: d_to_s64: 812; X86-SSE3-LIN: # %bb.0: 813; X86-SSE3-LIN-NEXT: subl $12, %esp 814; X86-SSE3-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 815; X86-SSE3-LIN-NEXT: movsd %xmm0, (%esp) 816; X86-SSE3-LIN-NEXT: fldl (%esp) 817; X86-SSE3-LIN-NEXT: fisttpll (%esp) 818; X86-SSE3-LIN-NEXT: movl (%esp), %eax 819; X86-SSE3-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 820; X86-SSE3-LIN-NEXT: addl $12, %esp 821; X86-SSE3-LIN-NEXT: retl 822; 823; X64-SSE-LABEL: d_to_s64: 824; X64-SSE: # %bb.0: 825; X64-SSE-NEXT: cvttsd2si %xmm0, %rax 826; X64-SSE-NEXT: retq 827; 828; X86-SSE2-WIN-LABEL: d_to_s64: 829; X86-SSE2-WIN: # %bb.0: 830; X86-SSE2-WIN-NEXT: pushl %ebp 831; X86-SSE2-WIN-NEXT: movl %esp, %ebp 832; X86-SSE2-WIN-NEXT: andl $-8, %esp 833; X86-SSE2-WIN-NEXT: subl $16, %esp 834; X86-SSE2-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 835; X86-SSE2-WIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp) 836; X86-SSE2-WIN-NEXT: fldl {{[0-9]+}}(%esp) 837; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 838; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 839; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 840; X86-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 841; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 842; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 843; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 844; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 845; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 846; X86-SSE2-WIN-NEXT: movl %ebp, %esp 847; X86-SSE2-WIN-NEXT: popl %ebp 848; X86-SSE2-WIN-NEXT: retl 849; 850; X86-SSE2-LIN-LABEL: d_to_s64: 851; X86-SSE2-LIN: # %bb.0: 852; X86-SSE2-LIN-NEXT: subl $20, %esp 853; X86-SSE2-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 854; X86-SSE2-LIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp) 855; X86-SSE2-LIN-NEXT: fldl {{[0-9]+}}(%esp) 856; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 857; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 858; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 859; X86-SSE2-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 860; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 861; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 862; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 863; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 864; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 865; X86-SSE2-LIN-NEXT: addl $20, %esp 866; X86-SSE2-LIN-NEXT: retl 867; 868; X87-WIN-LABEL: d_to_s64: 869; X87-WIN: # %bb.0: 870; X87-WIN-NEXT: pushl %ebp 871; X87-WIN-NEXT: movl %esp, %ebp 872; X87-WIN-NEXT: andl $-8, %esp 873; X87-WIN-NEXT: subl $16, %esp 874; X87-WIN-NEXT: fldl 8(%ebp) 875; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 876; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 877; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 878; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 879; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 880; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 881; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 882; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 883; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 884; X87-WIN-NEXT: movl %ebp, %esp 885; X87-WIN-NEXT: popl %ebp 886; X87-WIN-NEXT: retl 887; 888; X87-LIN-LABEL: d_to_s64: 889; X87-LIN: # %bb.0: 890; X87-LIN-NEXT: subl $20, %esp 891; X87-LIN-NEXT: fldl {{[0-9]+}}(%esp) 892; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 893; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 894; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 895; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 896; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 897; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 898; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 899; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 900; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 901; X87-LIN-NEXT: addl $20, %esp 902; X87-LIN-NEXT: retl 903 %r = fptosi double %a to i64 904 ret i64 %r 905} 906 907define i64 @x_to_u64(x86_fp80 %a) nounwind { 908; X86-AVX512-WIN-LABEL: x_to_u64: 909; X86-AVX512-WIN: # %bb.0: 910; X86-AVX512-WIN-NEXT: pushl %ebp 911; X86-AVX512-WIN-NEXT: movl %esp, %ebp 912; X86-AVX512-WIN-NEXT: andl $-16, %esp 913; X86-AVX512-WIN-NEXT: subl $16, %esp 914; X86-AVX512-WIN-NEXT: fldt 8(%ebp) 915; X86-AVX512-WIN-NEXT: flds __real@5f000000 916; X86-AVX512-WIN-NEXT: xorl %edx, %edx 917; X86-AVX512-WIN-NEXT: fucomi %st(1), %st 918; X86-AVX512-WIN-NEXT: fldz 919; X86-AVX512-WIN-NEXT: fcmovbe %st(1), %st 920; X86-AVX512-WIN-NEXT: fstp %st(1) 921; X86-AVX512-WIN-NEXT: fsubrp %st, %st(1) 922; X86-AVX512-WIN-NEXT: fisttpll (%esp) 923; X86-AVX512-WIN-NEXT: setbe %dl 924; X86-AVX512-WIN-NEXT: shll $31, %edx 925; X86-AVX512-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 926; X86-AVX512-WIN-NEXT: movl (%esp), %eax 927; X86-AVX512-WIN-NEXT: movl %ebp, %esp 928; X86-AVX512-WIN-NEXT: popl %ebp 929; X86-AVX512-WIN-NEXT: retl 930; 931; X86-AVX512-LIN-LABEL: x_to_u64: 932; X86-AVX512-LIN: # %bb.0: 933; X86-AVX512-LIN-NEXT: subl $12, %esp 934; X86-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%esp) 935; X86-AVX512-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 936; X86-AVX512-LIN-NEXT: xorl %edx, %edx 937; X86-AVX512-LIN-NEXT: fucomi %st(1), %st 938; X86-AVX512-LIN-NEXT: fldz 939; X86-AVX512-LIN-NEXT: fcmovbe %st(1), %st 940; X86-AVX512-LIN-NEXT: fstp %st(1) 941; X86-AVX512-LIN-NEXT: fsubrp %st, %st(1) 942; X86-AVX512-LIN-NEXT: fisttpll (%esp) 943; X86-AVX512-LIN-NEXT: setbe %dl 944; X86-AVX512-LIN-NEXT: shll $31, %edx 945; X86-AVX512-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 946; X86-AVX512-LIN-NEXT: movl (%esp), %eax 947; X86-AVX512-LIN-NEXT: addl $12, %esp 948; X86-AVX512-LIN-NEXT: retl 949; 950; X64-AVX512-WIN-LABEL: x_to_u64: 951; X64-AVX512-WIN: # %bb.0: 952; X64-AVX512-WIN-NEXT: pushq %rax 953; X64-AVX512-WIN-NEXT: fldt (%rcx) 954; X64-AVX512-WIN-NEXT: flds __real@5f000000(%rip) 955; X64-AVX512-WIN-NEXT: xorl %eax, %eax 956; X64-AVX512-WIN-NEXT: fucomi %st(1), %st 957; X64-AVX512-WIN-NEXT: fldz 958; X64-AVX512-WIN-NEXT: fcmovbe %st(1), %st 959; X64-AVX512-WIN-NEXT: fstp %st(1) 960; X64-AVX512-WIN-NEXT: fsubrp %st, %st(1) 961; X64-AVX512-WIN-NEXT: fisttpll (%rsp) 962; X64-AVX512-WIN-NEXT: setbe %al 963; X64-AVX512-WIN-NEXT: shlq $63, %rax 964; X64-AVX512-WIN-NEXT: xorq (%rsp), %rax 965; X64-AVX512-WIN-NEXT: popq %rcx 966; X64-AVX512-WIN-NEXT: retq 967; 968; X64-AVX512-LIN-LABEL: x_to_u64: 969; X64-AVX512-LIN: # %bb.0: 970; X64-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 971; X64-AVX512-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 972; X64-AVX512-LIN-NEXT: xorl %eax, %eax 973; X64-AVX512-LIN-NEXT: fucomi %st(1), %st 974; X64-AVX512-LIN-NEXT: fldz 975; X64-AVX512-LIN-NEXT: fcmovbe %st(1), %st 976; X64-AVX512-LIN-NEXT: fstp %st(1) 977; X64-AVX512-LIN-NEXT: fsubrp %st, %st(1) 978; X64-AVX512-LIN-NEXT: fisttpll -{{[0-9]+}}(%rsp) 979; X64-AVX512-LIN-NEXT: setbe %al 980; X64-AVX512-LIN-NEXT: shlq $63, %rax 981; X64-AVX512-LIN-NEXT: xorq -{{[0-9]+}}(%rsp), %rax 982; X64-AVX512-LIN-NEXT: retq 983; 984; X86-SSE3-WIN-LABEL: x_to_u64: 985; X86-SSE3-WIN: # %bb.0: 986; X86-SSE3-WIN-NEXT: pushl %ebp 987; X86-SSE3-WIN-NEXT: movl %esp, %ebp 988; X86-SSE3-WIN-NEXT: andl $-16, %esp 989; X86-SSE3-WIN-NEXT: subl $16, %esp 990; X86-SSE3-WIN-NEXT: fldt 8(%ebp) 991; X86-SSE3-WIN-NEXT: flds __real@5f000000 992; X86-SSE3-WIN-NEXT: xorl %edx, %edx 993; X86-SSE3-WIN-NEXT: fucomi %st(1), %st 994; X86-SSE3-WIN-NEXT: fldz 995; X86-SSE3-WIN-NEXT: fcmovbe %st(1), %st 996; X86-SSE3-WIN-NEXT: fstp %st(1) 997; X86-SSE3-WIN-NEXT: fsubrp %st, %st(1) 998; X86-SSE3-WIN-NEXT: fisttpll (%esp) 999; X86-SSE3-WIN-NEXT: setbe %dl 1000; X86-SSE3-WIN-NEXT: shll $31, %edx 1001; X86-SSE3-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 1002; X86-SSE3-WIN-NEXT: movl (%esp), %eax 1003; X86-SSE3-WIN-NEXT: movl %ebp, %esp 1004; X86-SSE3-WIN-NEXT: popl %ebp 1005; X86-SSE3-WIN-NEXT: retl 1006; 1007; X86-SSE3-LIN-LABEL: x_to_u64: 1008; X86-SSE3-LIN: # %bb.0: 1009; X86-SSE3-LIN-NEXT: subl $12, %esp 1010; X86-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1011; X86-SSE3-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1012; X86-SSE3-LIN-NEXT: xorl %edx, %edx 1013; X86-SSE3-LIN-NEXT: fucomi %st(1), %st 1014; X86-SSE3-LIN-NEXT: fldz 1015; X86-SSE3-LIN-NEXT: fcmovbe %st(1), %st 1016; X86-SSE3-LIN-NEXT: fstp %st(1) 1017; X86-SSE3-LIN-NEXT: fsubrp %st, %st(1) 1018; X86-SSE3-LIN-NEXT: fisttpll (%esp) 1019; X86-SSE3-LIN-NEXT: setbe %dl 1020; X86-SSE3-LIN-NEXT: shll $31, %edx 1021; X86-SSE3-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 1022; X86-SSE3-LIN-NEXT: movl (%esp), %eax 1023; X86-SSE3-LIN-NEXT: addl $12, %esp 1024; X86-SSE3-LIN-NEXT: retl 1025; 1026; X64-SSE3-WIN-LABEL: x_to_u64: 1027; X64-SSE3-WIN: # %bb.0: 1028; X64-SSE3-WIN-NEXT: pushq %rax 1029; X64-SSE3-WIN-NEXT: fldt (%rcx) 1030; X64-SSE3-WIN-NEXT: flds __real@5f000000(%rip) 1031; X64-SSE3-WIN-NEXT: xorl %eax, %eax 1032; X64-SSE3-WIN-NEXT: fucomi %st(1), %st 1033; X64-SSE3-WIN-NEXT: fldz 1034; X64-SSE3-WIN-NEXT: fcmovbe %st(1), %st 1035; X64-SSE3-WIN-NEXT: fstp %st(1) 1036; X64-SSE3-WIN-NEXT: fsubrp %st, %st(1) 1037; X64-SSE3-WIN-NEXT: fisttpll (%rsp) 1038; X64-SSE3-WIN-NEXT: setbe %al 1039; X64-SSE3-WIN-NEXT: shlq $63, %rax 1040; X64-SSE3-WIN-NEXT: xorq (%rsp), %rax 1041; X64-SSE3-WIN-NEXT: popq %rcx 1042; X64-SSE3-WIN-NEXT: retq 1043; 1044; X64-SSE3-LIN-LABEL: x_to_u64: 1045; X64-SSE3-LIN: # %bb.0: 1046; X64-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 1047; X64-SSE3-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 1048; X64-SSE3-LIN-NEXT: xorl %eax, %eax 1049; X64-SSE3-LIN-NEXT: fucomi %st(1), %st 1050; X64-SSE3-LIN-NEXT: fldz 1051; X64-SSE3-LIN-NEXT: fcmovbe %st(1), %st 1052; X64-SSE3-LIN-NEXT: fstp %st(1) 1053; X64-SSE3-LIN-NEXT: fsubrp %st, %st(1) 1054; X64-SSE3-LIN-NEXT: fisttpll -{{[0-9]+}}(%rsp) 1055; X64-SSE3-LIN-NEXT: setbe %al 1056; X64-SSE3-LIN-NEXT: shlq $63, %rax 1057; X64-SSE3-LIN-NEXT: xorq -{{[0-9]+}}(%rsp), %rax 1058; X64-SSE3-LIN-NEXT: retq 1059; 1060; X86-SSE2-WIN-LABEL: x_to_u64: 1061; X86-SSE2-WIN: # %bb.0: 1062; X86-SSE2-WIN-NEXT: pushl %ebp 1063; X86-SSE2-WIN-NEXT: movl %esp, %ebp 1064; X86-SSE2-WIN-NEXT: andl $-16, %esp 1065; X86-SSE2-WIN-NEXT: subl $32, %esp 1066; X86-SSE2-WIN-NEXT: fldt 8(%ebp) 1067; X86-SSE2-WIN-NEXT: flds __real@5f000000 1068; X86-SSE2-WIN-NEXT: xorl %edx, %edx 1069; X86-SSE2-WIN-NEXT: fucomi %st(1), %st 1070; X86-SSE2-WIN-NEXT: setbe %dl 1071; X86-SSE2-WIN-NEXT: fldz 1072; X86-SSE2-WIN-NEXT: fcmovbe %st(1), %st 1073; X86-SSE2-WIN-NEXT: fstp %st(1) 1074; X86-SSE2-WIN-NEXT: fsubrp %st, %st(1) 1075; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1076; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1077; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 1078; X86-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 1079; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1080; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 1081; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1082; X86-SSE2-WIN-NEXT: shll $31, %edx 1083; X86-SSE2-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 1084; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1085; X86-SSE2-WIN-NEXT: movl %ebp, %esp 1086; X86-SSE2-WIN-NEXT: popl %ebp 1087; X86-SSE2-WIN-NEXT: retl 1088; 1089; X86-SSE2-LIN-LABEL: x_to_u64: 1090; X86-SSE2-LIN: # %bb.0: 1091; X86-SSE2-LIN-NEXT: subl $20, %esp 1092; X86-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1093; X86-SSE2-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1094; X86-SSE2-LIN-NEXT: xorl %edx, %edx 1095; X86-SSE2-LIN-NEXT: fucomi %st(1), %st 1096; X86-SSE2-LIN-NEXT: setbe %dl 1097; X86-SSE2-LIN-NEXT: fldz 1098; X86-SSE2-LIN-NEXT: fcmovbe %st(1), %st 1099; X86-SSE2-LIN-NEXT: fstp %st(1) 1100; X86-SSE2-LIN-NEXT: fsubrp %st, %st(1) 1101; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1102; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1103; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 1104; X86-SSE2-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 1105; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1106; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 1107; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1108; X86-SSE2-LIN-NEXT: shll $31, %edx 1109; X86-SSE2-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 1110; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1111; X86-SSE2-LIN-NEXT: addl $20, %esp 1112; X86-SSE2-LIN-NEXT: retl 1113; 1114; X64-SSE2-WIN-LABEL: x_to_u64: 1115; X64-SSE2-WIN: # %bb.0: 1116; X64-SSE2-WIN-NEXT: subq $16, %rsp 1117; X64-SSE2-WIN-NEXT: fldt (%rcx) 1118; X64-SSE2-WIN-NEXT: flds __real@5f000000(%rip) 1119; X64-SSE2-WIN-NEXT: xorl %eax, %eax 1120; X64-SSE2-WIN-NEXT: fucomi %st(1), %st 1121; X64-SSE2-WIN-NEXT: setbe %al 1122; X64-SSE2-WIN-NEXT: fldz 1123; X64-SSE2-WIN-NEXT: fcmovbe %st(1), %st 1124; X64-SSE2-WIN-NEXT: fstp %st(1) 1125; X64-SSE2-WIN-NEXT: fsubrp %st, %st(1) 1126; X64-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%rsp) 1127; X64-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%rsp), %ecx 1128; X64-SSE2-WIN-NEXT: orl $3072, %ecx # imm = 0xC00 1129; X64-SSE2-WIN-NEXT: movw %cx, {{[0-9]+}}(%rsp) 1130; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 1131; X64-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%rsp) 1132; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 1133; X64-SSE2-WIN-NEXT: shlq $63, %rax 1134; X64-SSE2-WIN-NEXT: xorq {{[0-9]+}}(%rsp), %rax 1135; X64-SSE2-WIN-NEXT: addq $16, %rsp 1136; X64-SSE2-WIN-NEXT: retq 1137; 1138; X64-SSE2-LIN-LABEL: x_to_u64: 1139; X64-SSE2-LIN: # %bb.0: 1140; X64-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 1141; X64-SSE2-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 1142; X64-SSE2-LIN-NEXT: xorl %eax, %eax 1143; X64-SSE2-LIN-NEXT: fucomi %st(1), %st 1144; X64-SSE2-LIN-NEXT: setbe %al 1145; X64-SSE2-LIN-NEXT: fldz 1146; X64-SSE2-LIN-NEXT: fcmovbe %st(1), %st 1147; X64-SSE2-LIN-NEXT: fstp %st(1) 1148; X64-SSE2-LIN-NEXT: fsubrp %st, %st(1) 1149; X64-SSE2-LIN-NEXT: fnstcw -{{[0-9]+}}(%rsp) 1150; X64-SSE2-LIN-NEXT: movzwl -{{[0-9]+}}(%rsp), %ecx 1151; X64-SSE2-LIN-NEXT: orl $3072, %ecx # imm = 0xC00 1152; X64-SSE2-LIN-NEXT: movw %cx, -{{[0-9]+}}(%rsp) 1153; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 1154; X64-SSE2-LIN-NEXT: fistpll -{{[0-9]+}}(%rsp) 1155; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 1156; X64-SSE2-LIN-NEXT: shlq $63, %rax 1157; X64-SSE2-LIN-NEXT: xorq -{{[0-9]+}}(%rsp), %rax 1158; X64-SSE2-LIN-NEXT: retq 1159; 1160; X87-WIN-LABEL: x_to_u64: 1161; X87-WIN: # %bb.0: 1162; X87-WIN-NEXT: pushl %ebp 1163; X87-WIN-NEXT: movl %esp, %ebp 1164; X87-WIN-NEXT: andl $-16, %esp 1165; X87-WIN-NEXT: subl $32, %esp 1166; X87-WIN-NEXT: fldt 8(%ebp) 1167; X87-WIN-NEXT: flds __real@5f000000 1168; X87-WIN-NEXT: fucom %st(1) 1169; X87-WIN-NEXT: fnstsw %ax 1170; X87-WIN-NEXT: xorl %edx, %edx 1171; X87-WIN-NEXT: # kill: def $ah killed $ah killed $ax 1172; X87-WIN-NEXT: sahf 1173; X87-WIN-NEXT: setbe %al 1174; X87-WIN-NEXT: fldz 1175; X87-WIN-NEXT: jbe LBB4_2 1176; X87-WIN-NEXT: # %bb.1: 1177; X87-WIN-NEXT: fstp %st(1) 1178; X87-WIN-NEXT: fldz 1179; X87-WIN-NEXT: LBB4_2: 1180; X87-WIN-NEXT: fstp %st(0) 1181; X87-WIN-NEXT: fsubrp %st, %st(1) 1182; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1183; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 1184; X87-WIN-NEXT: orl $3072, %ecx # imm = 0xC00 1185; X87-WIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 1186; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1187; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 1188; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1189; X87-WIN-NEXT: movb %al, %dl 1190; X87-WIN-NEXT: shll $31, %edx 1191; X87-WIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 1192; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1193; X87-WIN-NEXT: movl %ebp, %esp 1194; X87-WIN-NEXT: popl %ebp 1195; X87-WIN-NEXT: retl 1196; 1197; X87-LIN-LABEL: x_to_u64: 1198; X87-LIN: # %bb.0: 1199; X87-LIN-NEXT: subl $20, %esp 1200; X87-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1201; X87-LIN-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1202; X87-LIN-NEXT: fucom %st(1) 1203; X87-LIN-NEXT: fnstsw %ax 1204; X87-LIN-NEXT: xorl %edx, %edx 1205; X87-LIN-NEXT: # kill: def $ah killed $ah killed $ax 1206; X87-LIN-NEXT: sahf 1207; X87-LIN-NEXT: setbe %al 1208; X87-LIN-NEXT: fldz 1209; X87-LIN-NEXT: jbe .LBB4_2 1210; X87-LIN-NEXT: # %bb.1: 1211; X87-LIN-NEXT: fstp %st(1) 1212; X87-LIN-NEXT: fldz 1213; X87-LIN-NEXT: .LBB4_2: 1214; X87-LIN-NEXT: fstp %st(0) 1215; X87-LIN-NEXT: fsubrp %st, %st(1) 1216; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1217; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 1218; X87-LIN-NEXT: orl $3072, %ecx # imm = 0xC00 1219; X87-LIN-NEXT: movw %cx, {{[0-9]+}}(%esp) 1220; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1221; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 1222; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1223; X87-LIN-NEXT: movb %al, %dl 1224; X87-LIN-NEXT: shll $31, %edx 1225; X87-LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx 1226; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1227; X87-LIN-NEXT: addl $20, %esp 1228; X87-LIN-NEXT: retl 1229 %r = fptoui x86_fp80 %a to i64 1230 ret i64 %r 1231} 1232 1233define i64 @x_to_s64(x86_fp80 %a) nounwind { 1234; X86-AVX512-WIN-LABEL: x_to_s64: 1235; X86-AVX512-WIN: # %bb.0: 1236; X86-AVX512-WIN-NEXT: pushl %ebp 1237; X86-AVX512-WIN-NEXT: movl %esp, %ebp 1238; X86-AVX512-WIN-NEXT: andl $-16, %esp 1239; X86-AVX512-WIN-NEXT: subl $16, %esp 1240; X86-AVX512-WIN-NEXT: fldt 8(%ebp) 1241; X86-AVX512-WIN-NEXT: fisttpll (%esp) 1242; X86-AVX512-WIN-NEXT: movl (%esp), %eax 1243; X86-AVX512-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1244; X86-AVX512-WIN-NEXT: movl %ebp, %esp 1245; X86-AVX512-WIN-NEXT: popl %ebp 1246; X86-AVX512-WIN-NEXT: retl 1247; 1248; X86-AVX512-LIN-LABEL: x_to_s64: 1249; X86-AVX512-LIN: # %bb.0: 1250; X86-AVX512-LIN-NEXT: subl $12, %esp 1251; X86-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1252; X86-AVX512-LIN-NEXT: fisttpll (%esp) 1253; X86-AVX512-LIN-NEXT: movl (%esp), %eax 1254; X86-AVX512-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1255; X86-AVX512-LIN-NEXT: addl $12, %esp 1256; X86-AVX512-LIN-NEXT: retl 1257; 1258; X64-AVX512-WIN-LABEL: x_to_s64: 1259; X64-AVX512-WIN: # %bb.0: 1260; X64-AVX512-WIN-NEXT: pushq %rax 1261; X64-AVX512-WIN-NEXT: fldt (%rcx) 1262; X64-AVX512-WIN-NEXT: fisttpll (%rsp) 1263; X64-AVX512-WIN-NEXT: movq (%rsp), %rax 1264; X64-AVX512-WIN-NEXT: popq %rcx 1265; X64-AVX512-WIN-NEXT: retq 1266; 1267; X64-AVX512-LIN-LABEL: x_to_s64: 1268; X64-AVX512-LIN: # %bb.0: 1269; X64-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 1270; X64-AVX512-LIN-NEXT: fisttpll -{{[0-9]+}}(%rsp) 1271; X64-AVX512-LIN-NEXT: movq -{{[0-9]+}}(%rsp), %rax 1272; X64-AVX512-LIN-NEXT: retq 1273; 1274; X86-SSE3-WIN-LABEL: x_to_s64: 1275; X86-SSE3-WIN: # %bb.0: 1276; X86-SSE3-WIN-NEXT: pushl %ebp 1277; X86-SSE3-WIN-NEXT: movl %esp, %ebp 1278; X86-SSE3-WIN-NEXT: andl $-16, %esp 1279; X86-SSE3-WIN-NEXT: subl $16, %esp 1280; X86-SSE3-WIN-NEXT: fldt 8(%ebp) 1281; X86-SSE3-WIN-NEXT: fisttpll (%esp) 1282; X86-SSE3-WIN-NEXT: movl (%esp), %eax 1283; X86-SSE3-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1284; X86-SSE3-WIN-NEXT: movl %ebp, %esp 1285; X86-SSE3-WIN-NEXT: popl %ebp 1286; X86-SSE3-WIN-NEXT: retl 1287; 1288; X86-SSE3-LIN-LABEL: x_to_s64: 1289; X86-SSE3-LIN: # %bb.0: 1290; X86-SSE3-LIN-NEXT: subl $12, %esp 1291; X86-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1292; X86-SSE3-LIN-NEXT: fisttpll (%esp) 1293; X86-SSE3-LIN-NEXT: movl (%esp), %eax 1294; X86-SSE3-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1295; X86-SSE3-LIN-NEXT: addl $12, %esp 1296; X86-SSE3-LIN-NEXT: retl 1297; 1298; X64-SSE3-WIN-LABEL: x_to_s64: 1299; X64-SSE3-WIN: # %bb.0: 1300; X64-SSE3-WIN-NEXT: pushq %rax 1301; X64-SSE3-WIN-NEXT: fldt (%rcx) 1302; X64-SSE3-WIN-NEXT: fisttpll (%rsp) 1303; X64-SSE3-WIN-NEXT: movq (%rsp), %rax 1304; X64-SSE3-WIN-NEXT: popq %rcx 1305; X64-SSE3-WIN-NEXT: retq 1306; 1307; X64-SSE3-LIN-LABEL: x_to_s64: 1308; X64-SSE3-LIN: # %bb.0: 1309; X64-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 1310; X64-SSE3-LIN-NEXT: fisttpll -{{[0-9]+}}(%rsp) 1311; X64-SSE3-LIN-NEXT: movq -{{[0-9]+}}(%rsp), %rax 1312; X64-SSE3-LIN-NEXT: retq 1313; 1314; X86-SSE2-WIN-LABEL: x_to_s64: 1315; X86-SSE2-WIN: # %bb.0: 1316; X86-SSE2-WIN-NEXT: pushl %ebp 1317; X86-SSE2-WIN-NEXT: movl %esp, %ebp 1318; X86-SSE2-WIN-NEXT: andl $-16, %esp 1319; X86-SSE2-WIN-NEXT: subl $32, %esp 1320; X86-SSE2-WIN-NEXT: fldt 8(%ebp) 1321; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1322; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1323; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 1324; X86-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 1325; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1326; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 1327; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1328; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1329; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1330; X86-SSE2-WIN-NEXT: movl %ebp, %esp 1331; X86-SSE2-WIN-NEXT: popl %ebp 1332; X86-SSE2-WIN-NEXT: retl 1333; 1334; X86-SSE2-LIN-LABEL: x_to_s64: 1335; X86-SSE2-LIN: # %bb.0: 1336; X86-SSE2-LIN-NEXT: subl $20, %esp 1337; X86-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1338; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1339; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1340; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 1341; X86-SSE2-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 1342; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1343; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 1344; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1345; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1346; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1347; X86-SSE2-LIN-NEXT: addl $20, %esp 1348; X86-SSE2-LIN-NEXT: retl 1349; 1350; X64-SSE2-WIN-LABEL: x_to_s64: 1351; X64-SSE2-WIN: # %bb.0: 1352; X64-SSE2-WIN-NEXT: subq $16, %rsp 1353; X64-SSE2-WIN-NEXT: fldt (%rcx) 1354; X64-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%rsp) 1355; X64-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 1356; X64-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 1357; X64-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%rsp) 1358; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 1359; X64-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%rsp) 1360; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 1361; X64-SSE2-WIN-NEXT: movq {{[0-9]+}}(%rsp), %rax 1362; X64-SSE2-WIN-NEXT: addq $16, %rsp 1363; X64-SSE2-WIN-NEXT: retq 1364; 1365; X64-SSE2-LIN-LABEL: x_to_s64: 1366; X64-SSE2-LIN: # %bb.0: 1367; X64-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 1368; X64-SSE2-LIN-NEXT: fnstcw -{{[0-9]+}}(%rsp) 1369; X64-SSE2-LIN-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 1370; X64-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 1371; X64-SSE2-LIN-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 1372; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 1373; X64-SSE2-LIN-NEXT: fistpll -{{[0-9]+}}(%rsp) 1374; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 1375; X64-SSE2-LIN-NEXT: movq -{{[0-9]+}}(%rsp), %rax 1376; X64-SSE2-LIN-NEXT: retq 1377; 1378; X87-WIN-LABEL: x_to_s64: 1379; X87-WIN: # %bb.0: 1380; X87-WIN-NEXT: pushl %ebp 1381; X87-WIN-NEXT: movl %esp, %ebp 1382; X87-WIN-NEXT: andl $-16, %esp 1383; X87-WIN-NEXT: subl $32, %esp 1384; X87-WIN-NEXT: fldt 8(%ebp) 1385; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1386; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1387; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 1388; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 1389; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1390; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 1391; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 1392; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1393; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1394; X87-WIN-NEXT: movl %ebp, %esp 1395; X87-WIN-NEXT: popl %ebp 1396; X87-WIN-NEXT: retl 1397; 1398; X87-LIN-LABEL: x_to_s64: 1399; X87-LIN: # %bb.0: 1400; X87-LIN-NEXT: subl $20, %esp 1401; X87-LIN-NEXT: fldt {{[0-9]+}}(%esp) 1402; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 1403; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1404; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 1405; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 1406; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1407; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 1408; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 1409; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 1410; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %edx 1411; X87-LIN-NEXT: addl $20, %esp 1412; X87-LIN-NEXT: retl 1413 %r = fptosi x86_fp80 %a to i64 1414 ret i64 %r 1415} 1416 1417define i64 @t_to_u64(fp128 %a) nounwind { 1418; X86-AVX512-WIN-LABEL: t_to_u64: 1419; X86-AVX512-WIN: # %bb.0: 1420; X86-AVX512-WIN-NEXT: subl $16, %esp 1421; X86-AVX512-WIN-NEXT: vmovups {{[0-9]+}}(%esp), %xmm0 1422; X86-AVX512-WIN-NEXT: vmovups %xmm0, (%esp) 1423; X86-AVX512-WIN-NEXT: calll ___fixunstfdi 1424; X86-AVX512-WIN-NEXT: addl $16, %esp 1425; X86-AVX512-WIN-NEXT: retl 1426; 1427; X86-AVX512-LIN-LABEL: t_to_u64: 1428; X86-AVX512-LIN: # %bb.0: 1429; X86-AVX512-LIN-NEXT: subl $28, %esp 1430; X86-AVX512-LIN-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0 1431; X86-AVX512-LIN-NEXT: vmovups %xmm0, (%esp) 1432; X86-AVX512-LIN-NEXT: calll __fixunstfdi 1433; X86-AVX512-LIN-NEXT: addl $28, %esp 1434; X86-AVX512-LIN-NEXT: retl 1435; 1436; X64-AVX512-WIN-LABEL: t_to_u64: 1437; X64-AVX512-WIN: # %bb.0: 1438; X64-AVX512-WIN-NEXT: subq $40, %rsp 1439; X64-AVX512-WIN-NEXT: callq __fixunstfdi 1440; X64-AVX512-WIN-NEXT: addq $40, %rsp 1441; X64-AVX512-WIN-NEXT: retq 1442; 1443; X64-AVX512-LIN-LABEL: t_to_u64: 1444; X64-AVX512-LIN: # %bb.0: 1445; X64-AVX512-LIN-NEXT: pushq %rax 1446; X64-AVX512-LIN-NEXT: callq __fixunstfdi@PLT 1447; X64-AVX512-LIN-NEXT: popq %rcx 1448; X64-AVX512-LIN-NEXT: retq 1449; 1450; X86-SSE-WIN-LABEL: t_to_u64: 1451; X86-SSE-WIN: # %bb.0: 1452; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1453; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1454; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1455; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1456; X86-SSE-WIN-NEXT: calll ___fixunstfdi 1457; X86-SSE-WIN-NEXT: addl $16, %esp 1458; X86-SSE-WIN-NEXT: retl 1459; 1460; X86-SSE-LIN-LABEL: t_to_u64: 1461; X86-SSE-LIN: # %bb.0: 1462; X86-SSE-LIN-NEXT: subl $12, %esp 1463; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1464; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1465; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1466; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1467; X86-SSE-LIN-NEXT: calll __fixunstfdi 1468; X86-SSE-LIN-NEXT: addl $28, %esp 1469; X86-SSE-LIN-NEXT: retl 1470; 1471; X64-SSE-WIN-LABEL: t_to_u64: 1472; X64-SSE-WIN: # %bb.0: 1473; X64-SSE-WIN-NEXT: subq $40, %rsp 1474; X64-SSE-WIN-NEXT: callq __fixunstfdi 1475; X64-SSE-WIN-NEXT: addq $40, %rsp 1476; X64-SSE-WIN-NEXT: retq 1477; 1478; X64-SSE-LIN-LABEL: t_to_u64: 1479; X64-SSE-LIN: # %bb.0: 1480; X64-SSE-LIN-NEXT: pushq %rax 1481; X64-SSE-LIN-NEXT: callq __fixunstfdi@PLT 1482; X64-SSE-LIN-NEXT: popq %rcx 1483; X64-SSE-LIN-NEXT: retq 1484; 1485; X87-WIN-LABEL: t_to_u64: 1486; X87-WIN: # %bb.0: 1487; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1488; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1489; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1490; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1491; X87-WIN-NEXT: calll ___fixunstfdi 1492; X87-WIN-NEXT: addl $16, %esp 1493; X87-WIN-NEXT: retl 1494; 1495; X87-LIN-LABEL: t_to_u64: 1496; X87-LIN: # %bb.0: 1497; X87-LIN-NEXT: subl $12, %esp 1498; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1499; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1500; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1501; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1502; X87-LIN-NEXT: calll __fixunstfdi 1503; X87-LIN-NEXT: addl $28, %esp 1504; X87-LIN-NEXT: retl 1505 %r = fptoui fp128 %a to i64 1506 ret i64 %r 1507} 1508 1509define i64 @t_to_s64(fp128 %a) nounwind { 1510; X86-AVX512-WIN-LABEL: t_to_s64: 1511; X86-AVX512-WIN: # %bb.0: 1512; X86-AVX512-WIN-NEXT: subl $16, %esp 1513; X86-AVX512-WIN-NEXT: vmovups {{[0-9]+}}(%esp), %xmm0 1514; X86-AVX512-WIN-NEXT: vmovups %xmm0, (%esp) 1515; X86-AVX512-WIN-NEXT: calll ___fixtfdi 1516; X86-AVX512-WIN-NEXT: addl $16, %esp 1517; X86-AVX512-WIN-NEXT: retl 1518; 1519; X86-AVX512-LIN-LABEL: t_to_s64: 1520; X86-AVX512-LIN: # %bb.0: 1521; X86-AVX512-LIN-NEXT: subl $28, %esp 1522; X86-AVX512-LIN-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0 1523; X86-AVX512-LIN-NEXT: vmovups %xmm0, (%esp) 1524; X86-AVX512-LIN-NEXT: calll __fixtfdi 1525; X86-AVX512-LIN-NEXT: addl $28, %esp 1526; X86-AVX512-LIN-NEXT: retl 1527; 1528; X64-AVX512-WIN-LABEL: t_to_s64: 1529; X64-AVX512-WIN: # %bb.0: 1530; X64-AVX512-WIN-NEXT: subq $40, %rsp 1531; X64-AVX512-WIN-NEXT: callq __fixtfdi 1532; X64-AVX512-WIN-NEXT: addq $40, %rsp 1533; X64-AVX512-WIN-NEXT: retq 1534; 1535; X64-AVX512-LIN-LABEL: t_to_s64: 1536; X64-AVX512-LIN: # %bb.0: 1537; X64-AVX512-LIN-NEXT: pushq %rax 1538; X64-AVX512-LIN-NEXT: callq __fixtfdi@PLT 1539; X64-AVX512-LIN-NEXT: popq %rcx 1540; X64-AVX512-LIN-NEXT: retq 1541; 1542; X86-SSE-WIN-LABEL: t_to_s64: 1543; X86-SSE-WIN: # %bb.0: 1544; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1545; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1546; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1547; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1548; X86-SSE-WIN-NEXT: calll ___fixtfdi 1549; X86-SSE-WIN-NEXT: addl $16, %esp 1550; X86-SSE-WIN-NEXT: retl 1551; 1552; X86-SSE-LIN-LABEL: t_to_s64: 1553; X86-SSE-LIN: # %bb.0: 1554; X86-SSE-LIN-NEXT: subl $12, %esp 1555; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1556; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1557; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1558; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1559; X86-SSE-LIN-NEXT: calll __fixtfdi 1560; X86-SSE-LIN-NEXT: addl $28, %esp 1561; X86-SSE-LIN-NEXT: retl 1562; 1563; X64-SSE-WIN-LABEL: t_to_s64: 1564; X64-SSE-WIN: # %bb.0: 1565; X64-SSE-WIN-NEXT: subq $40, %rsp 1566; X64-SSE-WIN-NEXT: callq __fixtfdi 1567; X64-SSE-WIN-NEXT: addq $40, %rsp 1568; X64-SSE-WIN-NEXT: retq 1569; 1570; X64-SSE-LIN-LABEL: t_to_s64: 1571; X64-SSE-LIN: # %bb.0: 1572; X64-SSE-LIN-NEXT: pushq %rax 1573; X64-SSE-LIN-NEXT: callq __fixtfdi@PLT 1574; X64-SSE-LIN-NEXT: popq %rcx 1575; X64-SSE-LIN-NEXT: retq 1576; 1577; X87-WIN-LABEL: t_to_s64: 1578; X87-WIN: # %bb.0: 1579; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1580; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1581; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1582; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 1583; X87-WIN-NEXT: calll ___fixtfdi 1584; X87-WIN-NEXT: addl $16, %esp 1585; X87-WIN-NEXT: retl 1586; 1587; X87-LIN-LABEL: t_to_s64: 1588; X87-LIN: # %bb.0: 1589; X87-LIN-NEXT: subl $12, %esp 1590; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1591; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1592; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1593; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 1594; X87-LIN-NEXT: calll __fixtfdi 1595; X87-LIN-NEXT: addl $28, %esp 1596; X87-LIN-NEXT: retl 1597 %r = fptosi fp128 %a to i64 1598 ret i64 %r 1599} 1600