1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=CHECK32,AVX512_32,AVX512DQVL_32 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=CHECK64,AVX512_64 4; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=CHECK32,AVX512_32,AVX512DQ_32 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=CHECK64,AVX512_64 6; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK32,AVX512_32,AVX512F_32 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK64,AVX512_64 8; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK32,SSE_32,SSE2_32 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK64,SSE2_64 10; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse | FileCheck %s --check-prefixes=CHECK32,SSE_32,SSE1_32 11; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=-sse | FileCheck %s --check-prefixes=CHECK32,X87 12 13; Verify that scalar integer conversions to FP compile successfully 14; (at one time long double failed with avx512f), and that reasonable 15; instruction sequences are selected based on subtarget features. 16 17define float @u32_to_f(i32 %a) nounwind { 18; AVX512_32-LABEL: u32_to_f: 19; AVX512_32: # %bb.0: 20; AVX512_32-NEXT: pushl %eax 21; AVX512_32-NEXT: vcvtusi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0 22; AVX512_32-NEXT: vmovss %xmm0, (%esp) 23; AVX512_32-NEXT: flds (%esp) 24; AVX512_32-NEXT: popl %eax 25; AVX512_32-NEXT: retl 26; 27; AVX512_64-LABEL: u32_to_f: 28; AVX512_64: # %bb.0: 29; AVX512_64-NEXT: vcvtusi2ss %edi, %xmm0, %xmm0 30; AVX512_64-NEXT: retq 31; 32; SSE2_32-LABEL: u32_to_f: 33; SSE2_32: # %bb.0: 34; SSE2_32-NEXT: pushl %eax 35; SSE2_32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 36; SSE2_32-NEXT: orpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 37; SSE2_32-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 38; SSE2_32-NEXT: cvtsd2ss %xmm0, %xmm0 39; SSE2_32-NEXT: movss %xmm0, (%esp) 40; SSE2_32-NEXT: flds (%esp) 41; SSE2_32-NEXT: popl %eax 42; SSE2_32-NEXT: retl 43; 44; SSE2_64-LABEL: u32_to_f: 45; SSE2_64: # %bb.0: 46; SSE2_64-NEXT: movl %edi, %eax 47; SSE2_64-NEXT: cvtsi2ss %rax, %xmm0 48; SSE2_64-NEXT: retq 49; 50; SSE1_32-LABEL: u32_to_f: 51; SSE1_32: # %bb.0: 52; SSE1_32-NEXT: pushl %ebp 53; SSE1_32-NEXT: movl %esp, %ebp 54; SSE1_32-NEXT: andl $-8, %esp 55; SSE1_32-NEXT: subl $16, %esp 56; SSE1_32-NEXT: movl 8(%ebp), %eax 57; SSE1_32-NEXT: movl %eax, {{[0-9]+}}(%esp) 58; SSE1_32-NEXT: movl $0, {{[0-9]+}}(%esp) 59; SSE1_32-NEXT: fildll {{[0-9]+}}(%esp) 60; SSE1_32-NEXT: fstps {{[0-9]+}}(%esp) 61; SSE1_32-NEXT: flds {{[0-9]+}}(%esp) 62; SSE1_32-NEXT: movl %ebp, %esp 63; SSE1_32-NEXT: popl %ebp 64; SSE1_32-NEXT: retl 65; 66; X87-LABEL: u32_to_f: 67; X87: # %bb.0: 68; X87-NEXT: pushl %ebp 69; X87-NEXT: movl %esp, %ebp 70; X87-NEXT: andl $-8, %esp 71; X87-NEXT: subl $8, %esp 72; X87-NEXT: movl 8(%ebp), %eax 73; X87-NEXT: movl %eax, (%esp) 74; X87-NEXT: movl $0, {{[0-9]+}}(%esp) 75; X87-NEXT: fildll (%esp) 76; X87-NEXT: movl %ebp, %esp 77; X87-NEXT: popl %ebp 78; X87-NEXT: retl 79 %r = uitofp i32 %a to float 80 ret float %r 81} 82 83define float @s32_to_f(i32 %a) nounwind { 84; AVX512_32-LABEL: s32_to_f: 85; AVX512_32: # %bb.0: 86; AVX512_32-NEXT: pushl %eax 87; AVX512_32-NEXT: vcvtsi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0 88; AVX512_32-NEXT: vmovss %xmm0, (%esp) 89; AVX512_32-NEXT: flds (%esp) 90; AVX512_32-NEXT: popl %eax 91; AVX512_32-NEXT: retl 92; 93; AVX512_64-LABEL: s32_to_f: 94; AVX512_64: # %bb.0: 95; AVX512_64-NEXT: vcvtsi2ss %edi, %xmm0, %xmm0 96; AVX512_64-NEXT: retq 97; 98; SSE_32-LABEL: s32_to_f: 99; SSE_32: # %bb.0: 100; SSE_32-NEXT: pushl %eax 101; SSE_32-NEXT: cvtsi2ssl {{[0-9]+}}(%esp), %xmm0 102; SSE_32-NEXT: movss %xmm0, (%esp) 103; SSE_32-NEXT: flds (%esp) 104; SSE_32-NEXT: popl %eax 105; SSE_32-NEXT: retl 106; 107; SSE2_64-LABEL: s32_to_f: 108; SSE2_64: # %bb.0: 109; SSE2_64-NEXT: cvtsi2ss %edi, %xmm0 110; SSE2_64-NEXT: retq 111; 112; X87-LABEL: s32_to_f: 113; X87: # %bb.0: 114; X87-NEXT: pushl %eax 115; X87-NEXT: movl {{[0-9]+}}(%esp), %eax 116; X87-NEXT: movl %eax, (%esp) 117; X87-NEXT: fildl (%esp) 118; X87-NEXT: popl %eax 119; X87-NEXT: retl 120 %r = sitofp i32 %a to float 121 ret float %r 122} 123 124define double @u32_to_d(i32 %a) nounwind { 125; AVX512_32-LABEL: u32_to_d: 126; AVX512_32: # %bb.0: 127; AVX512_32-NEXT: pushl %ebp 128; AVX512_32-NEXT: movl %esp, %ebp 129; AVX512_32-NEXT: andl $-8, %esp 130; AVX512_32-NEXT: subl $8, %esp 131; AVX512_32-NEXT: vcvtusi2sdl 8(%ebp), %xmm0, %xmm0 132; AVX512_32-NEXT: vmovsd %xmm0, (%esp) 133; AVX512_32-NEXT: fldl (%esp) 134; AVX512_32-NEXT: movl %ebp, %esp 135; AVX512_32-NEXT: popl %ebp 136; AVX512_32-NEXT: retl 137; 138; AVX512_64-LABEL: u32_to_d: 139; AVX512_64: # %bb.0: 140; AVX512_64-NEXT: vcvtusi2sd %edi, %xmm0, %xmm0 141; AVX512_64-NEXT: retq 142; 143; SSE2_32-LABEL: u32_to_d: 144; SSE2_32: # %bb.0: 145; SSE2_32-NEXT: pushl %ebp 146; SSE2_32-NEXT: movl %esp, %ebp 147; SSE2_32-NEXT: andl $-8, %esp 148; SSE2_32-NEXT: subl $8, %esp 149; SSE2_32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 150; SSE2_32-NEXT: orpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 151; SSE2_32-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 152; SSE2_32-NEXT: movsd %xmm0, (%esp) 153; SSE2_32-NEXT: fldl (%esp) 154; SSE2_32-NEXT: movl %ebp, %esp 155; SSE2_32-NEXT: popl %ebp 156; SSE2_32-NEXT: retl 157; 158; SSE2_64-LABEL: u32_to_d: 159; SSE2_64: # %bb.0: 160; SSE2_64-NEXT: movl %edi, %eax 161; SSE2_64-NEXT: cvtsi2sd %rax, %xmm0 162; SSE2_64-NEXT: retq 163; 164; SSE1_32-LABEL: u32_to_d: 165; SSE1_32: # %bb.0: 166; SSE1_32-NEXT: pushl %ebp 167; SSE1_32-NEXT: movl %esp, %ebp 168; SSE1_32-NEXT: andl $-8, %esp 169; SSE1_32-NEXT: subl $8, %esp 170; SSE1_32-NEXT: movl 8(%ebp), %eax 171; SSE1_32-NEXT: movl %eax, (%esp) 172; SSE1_32-NEXT: movl $0, {{[0-9]+}}(%esp) 173; SSE1_32-NEXT: fildll (%esp) 174; SSE1_32-NEXT: movl %ebp, %esp 175; SSE1_32-NEXT: popl %ebp 176; SSE1_32-NEXT: retl 177; 178; X87-LABEL: u32_to_d: 179; X87: # %bb.0: 180; X87-NEXT: pushl %ebp 181; X87-NEXT: movl %esp, %ebp 182; X87-NEXT: andl $-8, %esp 183; X87-NEXT: subl $8, %esp 184; X87-NEXT: movl 8(%ebp), %eax 185; X87-NEXT: movl %eax, (%esp) 186; X87-NEXT: movl $0, {{[0-9]+}}(%esp) 187; X87-NEXT: fildll (%esp) 188; X87-NEXT: movl %ebp, %esp 189; X87-NEXT: popl %ebp 190; X87-NEXT: retl 191 %r = uitofp i32 %a to double 192 ret double %r 193} 194 195define double @s32_to_d(i32 %a) nounwind { 196; AVX512_32-LABEL: s32_to_d: 197; AVX512_32: # %bb.0: 198; AVX512_32-NEXT: pushl %ebp 199; AVX512_32-NEXT: movl %esp, %ebp 200; AVX512_32-NEXT: andl $-8, %esp 201; AVX512_32-NEXT: subl $8, %esp 202; AVX512_32-NEXT: vcvtsi2sdl 8(%ebp), %xmm0, %xmm0 203; AVX512_32-NEXT: vmovsd %xmm0, (%esp) 204; AVX512_32-NEXT: fldl (%esp) 205; AVX512_32-NEXT: movl %ebp, %esp 206; AVX512_32-NEXT: popl %ebp 207; AVX512_32-NEXT: retl 208; 209; AVX512_64-LABEL: s32_to_d: 210; AVX512_64: # %bb.0: 211; AVX512_64-NEXT: vcvtsi2sd %edi, %xmm0, %xmm0 212; AVX512_64-NEXT: retq 213; 214; SSE2_32-LABEL: s32_to_d: 215; SSE2_32: # %bb.0: 216; SSE2_32-NEXT: pushl %ebp 217; SSE2_32-NEXT: movl %esp, %ebp 218; SSE2_32-NEXT: andl $-8, %esp 219; SSE2_32-NEXT: subl $8, %esp 220; SSE2_32-NEXT: cvtsi2sdl 8(%ebp), %xmm0 221; SSE2_32-NEXT: movsd %xmm0, (%esp) 222; SSE2_32-NEXT: fldl (%esp) 223; SSE2_32-NEXT: movl %ebp, %esp 224; SSE2_32-NEXT: popl %ebp 225; SSE2_32-NEXT: retl 226; 227; SSE2_64-LABEL: s32_to_d: 228; SSE2_64: # %bb.0: 229; SSE2_64-NEXT: cvtsi2sd %edi, %xmm0 230; SSE2_64-NEXT: retq 231; 232; SSE1_32-LABEL: s32_to_d: 233; SSE1_32: # %bb.0: 234; SSE1_32-NEXT: pushl %eax 235; SSE1_32-NEXT: movl {{[0-9]+}}(%esp), %eax 236; SSE1_32-NEXT: movl %eax, (%esp) 237; SSE1_32-NEXT: fildl (%esp) 238; SSE1_32-NEXT: popl %eax 239; SSE1_32-NEXT: retl 240; 241; X87-LABEL: s32_to_d: 242; X87: # %bb.0: 243; X87-NEXT: pushl %eax 244; X87-NEXT: movl {{[0-9]+}}(%esp), %eax 245; X87-NEXT: movl %eax, (%esp) 246; X87-NEXT: fildl (%esp) 247; X87-NEXT: popl %eax 248; X87-NEXT: retl 249 %r = sitofp i32 %a to double 250 ret double %r 251} 252 253define x86_fp80 @u32_to_x(i32 %a) nounwind { 254; CHECK32-LABEL: u32_to_x: 255; CHECK32: # %bb.0: 256; CHECK32-NEXT: pushl %ebp 257; CHECK32-NEXT: movl %esp, %ebp 258; CHECK32-NEXT: andl $-8, %esp 259; CHECK32-NEXT: subl $8, %esp 260; CHECK32-NEXT: movl 8(%ebp), %eax 261; CHECK32-NEXT: movl %eax, (%esp) 262; CHECK32-NEXT: movl $0, {{[0-9]+}}(%esp) 263; CHECK32-NEXT: fildll (%esp) 264; CHECK32-NEXT: movl %ebp, %esp 265; CHECK32-NEXT: popl %ebp 266; CHECK32-NEXT: retl 267; 268; CHECK64-LABEL: u32_to_x: 269; CHECK64: # %bb.0: 270; CHECK64-NEXT: movl %edi, %eax 271; CHECK64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) 272; CHECK64-NEXT: fildll -{{[0-9]+}}(%rsp) 273; CHECK64-NEXT: retq 274 %r = uitofp i32 %a to x86_fp80 275 ret x86_fp80 %r 276} 277 278define x86_fp80 @s32_to_x(i32 %a) nounwind { 279; CHECK32-LABEL: s32_to_x: 280; CHECK32: # %bb.0: 281; CHECK32-NEXT: pushl %eax 282; CHECK32-NEXT: movl {{[0-9]+}}(%esp), %eax 283; CHECK32-NEXT: movl %eax, (%esp) 284; CHECK32-NEXT: fildl (%esp) 285; CHECK32-NEXT: popl %eax 286; CHECK32-NEXT: retl 287; 288; CHECK64-LABEL: s32_to_x: 289; CHECK64: # %bb.0: 290; CHECK64-NEXT: movl %edi, -{{[0-9]+}}(%rsp) 291; CHECK64-NEXT: fildl -{{[0-9]+}}(%rsp) 292; CHECK64-NEXT: retq 293 %r = sitofp i32 %a to x86_fp80 294 ret x86_fp80 %r 295} 296 297define float @u64_to_f(i64 %a) nounwind { 298; AVX512DQVL_32-LABEL: u64_to_f: 299; AVX512DQVL_32: # %bb.0: 300; AVX512DQVL_32-NEXT: pushl %eax 301; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 302; AVX512DQVL_32-NEXT: vcvtuqq2ps %ymm0, %xmm0 303; AVX512DQVL_32-NEXT: vmovss %xmm0, (%esp) 304; AVX512DQVL_32-NEXT: flds (%esp) 305; AVX512DQVL_32-NEXT: popl %eax 306; AVX512DQVL_32-NEXT: vzeroupper 307; AVX512DQVL_32-NEXT: retl 308; 309; AVX512_64-LABEL: u64_to_f: 310; AVX512_64: # %bb.0: 311; AVX512_64-NEXT: vcvtusi2ss %rdi, %xmm0, %xmm0 312; AVX512_64-NEXT: retq 313; 314; AVX512DQ_32-LABEL: u64_to_f: 315; AVX512DQ_32: # %bb.0: 316; AVX512DQ_32-NEXT: pushl %eax 317; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 318; AVX512DQ_32-NEXT: vcvtuqq2ps %zmm0, %ymm0 319; AVX512DQ_32-NEXT: vmovss %xmm0, (%esp) 320; AVX512DQ_32-NEXT: flds (%esp) 321; AVX512DQ_32-NEXT: popl %eax 322; AVX512DQ_32-NEXT: vzeroupper 323; AVX512DQ_32-NEXT: retl 324; 325; AVX512F_32-LABEL: u64_to_f: 326; AVX512F_32: # %bb.0: 327; AVX512F_32-NEXT: pushl %ebp 328; AVX512F_32-NEXT: movl %esp, %ebp 329; AVX512F_32-NEXT: andl $-8, %esp 330; AVX512F_32-NEXT: subl $16, %esp 331; AVX512F_32-NEXT: movl 12(%ebp), %eax 332; AVX512F_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 333; AVX512F_32-NEXT: vmovlps %xmm0, {{[0-9]+}}(%esp) 334; AVX512F_32-NEXT: shrl $31, %eax 335; AVX512F_32-NEXT: fildll {{[0-9]+}}(%esp) 336; AVX512F_32-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4) 337; AVX512F_32-NEXT: fstps {{[0-9]+}}(%esp) 338; AVX512F_32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 339; AVX512F_32-NEXT: vmovss %xmm0, (%esp) 340; AVX512F_32-NEXT: flds (%esp) 341; AVX512F_32-NEXT: movl %ebp, %esp 342; AVX512F_32-NEXT: popl %ebp 343; AVX512F_32-NEXT: retl 344; 345; SSE2_32-LABEL: u64_to_f: 346; SSE2_32: # %bb.0: 347; SSE2_32-NEXT: pushl %ebp 348; SSE2_32-NEXT: movl %esp, %ebp 349; SSE2_32-NEXT: andl $-8, %esp 350; SSE2_32-NEXT: subl $16, %esp 351; SSE2_32-NEXT: movl 12(%ebp), %eax 352; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 353; SSE2_32-NEXT: movlps %xmm0, {{[0-9]+}}(%esp) 354; SSE2_32-NEXT: shrl $31, %eax 355; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp) 356; SSE2_32-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4) 357; SSE2_32-NEXT: fstps {{[0-9]+}}(%esp) 358; SSE2_32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 359; SSE2_32-NEXT: movss %xmm0, (%esp) 360; SSE2_32-NEXT: flds (%esp) 361; SSE2_32-NEXT: movl %ebp, %esp 362; SSE2_32-NEXT: popl %ebp 363; SSE2_32-NEXT: retl 364; 365; SSE2_64-LABEL: u64_to_f: 366; SSE2_64: # %bb.0: 367; SSE2_64-NEXT: testq %rdi, %rdi 368; SSE2_64-NEXT: js .LBB6_1 369; SSE2_64-NEXT: # %bb.2: 370; SSE2_64-NEXT: cvtsi2ss %rdi, %xmm0 371; SSE2_64-NEXT: retq 372; SSE2_64-NEXT: .LBB6_1: 373; SSE2_64-NEXT: movq %rdi, %rax 374; SSE2_64-NEXT: shrq %rax 375; SSE2_64-NEXT: andl $1, %edi 376; SSE2_64-NEXT: orq %rax, %rdi 377; SSE2_64-NEXT: cvtsi2ss %rdi, %xmm0 378; SSE2_64-NEXT: addss %xmm0, %xmm0 379; SSE2_64-NEXT: retq 380; 381; SSE1_32-LABEL: u64_to_f: 382; SSE1_32: # %bb.0: 383; SSE1_32-NEXT: pushl %ebp 384; SSE1_32-NEXT: movl %esp, %ebp 385; SSE1_32-NEXT: andl $-8, %esp 386; SSE1_32-NEXT: subl $24, %esp 387; SSE1_32-NEXT: movl 8(%ebp), %eax 388; SSE1_32-NEXT: movl 12(%ebp), %ecx 389; SSE1_32-NEXT: movl %ecx, {{[0-9]+}}(%esp) 390; SSE1_32-NEXT: movl %eax, {{[0-9]+}}(%esp) 391; SSE1_32-NEXT: fldl {{[0-9]+}}(%esp) 392; SSE1_32-NEXT: fstpl {{[0-9]+}}(%esp) 393; SSE1_32-NEXT: shrl $31, %ecx 394; SSE1_32-NEXT: fildll {{[0-9]+}}(%esp) 395; SSE1_32-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 396; SSE1_32-NEXT: fstps {{[0-9]+}}(%esp) 397; SSE1_32-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 398; SSE1_32-NEXT: movss %xmm0, (%esp) 399; SSE1_32-NEXT: flds (%esp) 400; SSE1_32-NEXT: movl %ebp, %esp 401; SSE1_32-NEXT: popl %ebp 402; SSE1_32-NEXT: retl 403; 404; X87-LABEL: u64_to_f: 405; X87: # %bb.0: 406; X87-NEXT: pushl %ebp 407; X87-NEXT: movl %esp, %ebp 408; X87-NEXT: andl $-8, %esp 409; X87-NEXT: subl $16, %esp 410; X87-NEXT: movl 8(%ebp), %eax 411; X87-NEXT: movl 12(%ebp), %ecx 412; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp) 413; X87-NEXT: movl %eax, {{[0-9]+}}(%esp) 414; X87-NEXT: shrl $31, %ecx 415; X87-NEXT: fildll {{[0-9]+}}(%esp) 416; X87-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 417; X87-NEXT: fstps {{[0-9]+}}(%esp) 418; X87-NEXT: flds {{[0-9]+}}(%esp) 419; X87-NEXT: movl %ebp, %esp 420; X87-NEXT: popl %ebp 421; X87-NEXT: retl 422 %r = uitofp i64 %a to float 423 ret float %r 424} 425 426define float @s64_to_f(i64 %a) nounwind { 427; AVX512DQVL_32-LABEL: s64_to_f: 428; AVX512DQVL_32: # %bb.0: 429; AVX512DQVL_32-NEXT: pushl %eax 430; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 431; AVX512DQVL_32-NEXT: vcvtqq2ps %ymm0, %xmm0 432; AVX512DQVL_32-NEXT: vmovss %xmm0, (%esp) 433; AVX512DQVL_32-NEXT: flds (%esp) 434; AVX512DQVL_32-NEXT: popl %eax 435; AVX512DQVL_32-NEXT: vzeroupper 436; AVX512DQVL_32-NEXT: retl 437; 438; AVX512_64-LABEL: s64_to_f: 439; AVX512_64: # %bb.0: 440; AVX512_64-NEXT: vcvtsi2ss %rdi, %xmm0, %xmm0 441; AVX512_64-NEXT: retq 442; 443; AVX512DQ_32-LABEL: s64_to_f: 444; AVX512DQ_32: # %bb.0: 445; AVX512DQ_32-NEXT: pushl %eax 446; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 447; AVX512DQ_32-NEXT: vcvtqq2ps %zmm0, %ymm0 448; AVX512DQ_32-NEXT: vmovss %xmm0, (%esp) 449; AVX512DQ_32-NEXT: flds (%esp) 450; AVX512DQ_32-NEXT: popl %eax 451; AVX512DQ_32-NEXT: vzeroupper 452; AVX512DQ_32-NEXT: retl 453; 454; AVX512F_32-LABEL: s64_to_f: 455; AVX512F_32: # %bb.0: 456; AVX512F_32-NEXT: pushl %eax 457; AVX512F_32-NEXT: fildll {{[0-9]+}}(%esp) 458; AVX512F_32-NEXT: fstps (%esp) 459; AVX512F_32-NEXT: flds (%esp) 460; AVX512F_32-NEXT: popl %eax 461; AVX512F_32-NEXT: retl 462; 463; SSE_32-LABEL: s64_to_f: 464; SSE_32: # %bb.0: 465; SSE_32-NEXT: pushl %eax 466; SSE_32-NEXT: fildll {{[0-9]+}}(%esp) 467; SSE_32-NEXT: fstps (%esp) 468; SSE_32-NEXT: flds (%esp) 469; SSE_32-NEXT: popl %eax 470; SSE_32-NEXT: retl 471; 472; SSE2_64-LABEL: s64_to_f: 473; SSE2_64: # %bb.0: 474; SSE2_64-NEXT: cvtsi2ss %rdi, %xmm0 475; SSE2_64-NEXT: retq 476; 477; X87-LABEL: s64_to_f: 478; X87: # %bb.0: 479; X87-NEXT: fildll {{[0-9]+}}(%esp) 480; X87-NEXT: retl 481 %r = sitofp i64 %a to float 482 ret float %r 483} 484 485define float @s64_to_f_2(i64 %a) nounwind { 486; AVX512DQVL_32-LABEL: s64_to_f_2: 487; AVX512DQVL_32: # %bb.0: 488; AVX512DQVL_32-NEXT: pushl %eax 489; AVX512DQVL_32-NEXT: movl {{[0-9]+}}(%esp), %eax 490; AVX512DQVL_32-NEXT: movl {{[0-9]+}}(%esp), %ecx 491; AVX512DQVL_32-NEXT: addl $5, %eax 492; AVX512DQVL_32-NEXT: adcl $0, %ecx 493; AVX512DQVL_32-NEXT: vmovd %eax, %xmm0 494; AVX512DQVL_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0 495; AVX512DQVL_32-NEXT: vcvtqq2ps %ymm0, %xmm0 496; AVX512DQVL_32-NEXT: vmovss %xmm0, (%esp) 497; AVX512DQVL_32-NEXT: flds (%esp) 498; AVX512DQVL_32-NEXT: popl %eax 499; AVX512DQVL_32-NEXT: vzeroupper 500; AVX512DQVL_32-NEXT: retl 501; 502; AVX512_64-LABEL: s64_to_f_2: 503; AVX512_64: # %bb.0: 504; AVX512_64-NEXT: addq $5, %rdi 505; AVX512_64-NEXT: vcvtsi2ss %rdi, %xmm0, %xmm0 506; AVX512_64-NEXT: retq 507; 508; AVX512DQ_32-LABEL: s64_to_f_2: 509; AVX512DQ_32: # %bb.0: 510; AVX512DQ_32-NEXT: pushl %eax 511; AVX512DQ_32-NEXT: movl {{[0-9]+}}(%esp), %eax 512; AVX512DQ_32-NEXT: movl {{[0-9]+}}(%esp), %ecx 513; AVX512DQ_32-NEXT: addl $5, %eax 514; AVX512DQ_32-NEXT: adcl $0, %ecx 515; AVX512DQ_32-NEXT: vmovd %eax, %xmm0 516; AVX512DQ_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0 517; AVX512DQ_32-NEXT: vcvtqq2ps %zmm0, %ymm0 518; AVX512DQ_32-NEXT: vmovss %xmm0, (%esp) 519; AVX512DQ_32-NEXT: flds (%esp) 520; AVX512DQ_32-NEXT: popl %eax 521; AVX512DQ_32-NEXT: vzeroupper 522; AVX512DQ_32-NEXT: retl 523; 524; AVX512F_32-LABEL: s64_to_f_2: 525; AVX512F_32: # %bb.0: 526; AVX512F_32-NEXT: pushl %ebp 527; AVX512F_32-NEXT: movl %esp, %ebp 528; AVX512F_32-NEXT: andl $-8, %esp 529; AVX512F_32-NEXT: subl $16, %esp 530; AVX512F_32-NEXT: movl 8(%ebp), %eax 531; AVX512F_32-NEXT: movl 12(%ebp), %ecx 532; AVX512F_32-NEXT: addl $5, %eax 533; AVX512F_32-NEXT: adcl $0, %ecx 534; AVX512F_32-NEXT: vmovd %eax, %xmm0 535; AVX512F_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0 536; AVX512F_32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp) 537; AVX512F_32-NEXT: fildll {{[0-9]+}}(%esp) 538; AVX512F_32-NEXT: fstps {{[0-9]+}}(%esp) 539; AVX512F_32-NEXT: flds {{[0-9]+}}(%esp) 540; AVX512F_32-NEXT: movl %ebp, %esp 541; AVX512F_32-NEXT: popl %ebp 542; AVX512F_32-NEXT: retl 543; 544; SSE2_32-LABEL: s64_to_f_2: 545; SSE2_32: # %bb.0: 546; SSE2_32-NEXT: pushl %ebp 547; SSE2_32-NEXT: movl %esp, %ebp 548; SSE2_32-NEXT: andl $-8, %esp 549; SSE2_32-NEXT: subl $16, %esp 550; SSE2_32-NEXT: movl 8(%ebp), %eax 551; SSE2_32-NEXT: movl 12(%ebp), %ecx 552; SSE2_32-NEXT: addl $5, %eax 553; SSE2_32-NEXT: adcl $0, %ecx 554; SSE2_32-NEXT: movd %ecx, %xmm0 555; SSE2_32-NEXT: movd %eax, %xmm1 556; SSE2_32-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 557; SSE2_32-NEXT: movq %xmm1, {{[0-9]+}}(%esp) 558; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp) 559; SSE2_32-NEXT: fstps {{[0-9]+}}(%esp) 560; SSE2_32-NEXT: flds {{[0-9]+}}(%esp) 561; SSE2_32-NEXT: movl %ebp, %esp 562; SSE2_32-NEXT: popl %ebp 563; SSE2_32-NEXT: retl 564; 565; SSE2_64-LABEL: s64_to_f_2: 566; SSE2_64: # %bb.0: 567; SSE2_64-NEXT: addq $5, %rdi 568; SSE2_64-NEXT: cvtsi2ss %rdi, %xmm0 569; SSE2_64-NEXT: retq 570; 571; SSE1_32-LABEL: s64_to_f_2: 572; SSE1_32: # %bb.0: 573; SSE1_32-NEXT: pushl %ebp 574; SSE1_32-NEXT: movl %esp, %ebp 575; SSE1_32-NEXT: andl $-8, %esp 576; SSE1_32-NEXT: subl $16, %esp 577; SSE1_32-NEXT: movl 8(%ebp), %eax 578; SSE1_32-NEXT: movl 12(%ebp), %ecx 579; SSE1_32-NEXT: addl $5, %eax 580; SSE1_32-NEXT: adcl $0, %ecx 581; SSE1_32-NEXT: movl %eax, {{[0-9]+}}(%esp) 582; SSE1_32-NEXT: movl %ecx, {{[0-9]+}}(%esp) 583; SSE1_32-NEXT: fildll {{[0-9]+}}(%esp) 584; SSE1_32-NEXT: fstps {{[0-9]+}}(%esp) 585; SSE1_32-NEXT: flds {{[0-9]+}}(%esp) 586; SSE1_32-NEXT: movl %ebp, %esp 587; SSE1_32-NEXT: popl %ebp 588; SSE1_32-NEXT: retl 589; 590; X87-LABEL: s64_to_f_2: 591; X87: # %bb.0: 592; X87-NEXT: pushl %ebp 593; X87-NEXT: movl %esp, %ebp 594; X87-NEXT: andl $-8, %esp 595; X87-NEXT: subl $8, %esp 596; X87-NEXT: movl 8(%ebp), %eax 597; X87-NEXT: movl 12(%ebp), %ecx 598; X87-NEXT: addl $5, %eax 599; X87-NEXT: adcl $0, %ecx 600; X87-NEXT: movl %eax, (%esp) 601; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp) 602; X87-NEXT: fildll (%esp) 603; X87-NEXT: movl %ebp, %esp 604; X87-NEXT: popl %ebp 605; X87-NEXT: retl 606 %a1 = add i64 %a, 5 607 %r = sitofp i64 %a1 to float 608 ret float %r 609} 610 611define double @u64_to_d(i64 %a) nounwind { 612; AVX512DQVL_32-LABEL: u64_to_d: 613; AVX512DQVL_32: # %bb.0: 614; AVX512DQVL_32-NEXT: pushl %ebp 615; AVX512DQVL_32-NEXT: movl %esp, %ebp 616; AVX512DQVL_32-NEXT: andl $-8, %esp 617; AVX512DQVL_32-NEXT: subl $8, %esp 618; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 619; AVX512DQVL_32-NEXT: vcvtuqq2pd %ymm0, %ymm0 620; AVX512DQVL_32-NEXT: vmovlps %xmm0, (%esp) 621; AVX512DQVL_32-NEXT: fldl (%esp) 622; AVX512DQVL_32-NEXT: movl %ebp, %esp 623; AVX512DQVL_32-NEXT: popl %ebp 624; AVX512DQVL_32-NEXT: vzeroupper 625; AVX512DQVL_32-NEXT: retl 626; 627; AVX512_64-LABEL: u64_to_d: 628; AVX512_64: # %bb.0: 629; AVX512_64-NEXT: vcvtusi2sd %rdi, %xmm0, %xmm0 630; AVX512_64-NEXT: retq 631; 632; AVX512DQ_32-LABEL: u64_to_d: 633; AVX512DQ_32: # %bb.0: 634; AVX512DQ_32-NEXT: pushl %ebp 635; AVX512DQ_32-NEXT: movl %esp, %ebp 636; AVX512DQ_32-NEXT: andl $-8, %esp 637; AVX512DQ_32-NEXT: subl $8, %esp 638; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 639; AVX512DQ_32-NEXT: vcvtuqq2pd %zmm0, %zmm0 640; AVX512DQ_32-NEXT: vmovlps %xmm0, (%esp) 641; AVX512DQ_32-NEXT: fldl (%esp) 642; AVX512DQ_32-NEXT: movl %ebp, %esp 643; AVX512DQ_32-NEXT: popl %ebp 644; AVX512DQ_32-NEXT: vzeroupper 645; AVX512DQ_32-NEXT: retl 646; 647; AVX512F_32-LABEL: u64_to_d: 648; AVX512F_32: # %bb.0: 649; AVX512F_32-NEXT: pushl %ebp 650; AVX512F_32-NEXT: movl %esp, %ebp 651; AVX512F_32-NEXT: andl $-8, %esp 652; AVX512F_32-NEXT: subl $8, %esp 653; AVX512F_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 654; AVX512F_32-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] 655; AVX512F_32-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 656; AVX512F_32-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] 657; AVX512F_32-NEXT: vaddsd %xmm0, %xmm1, %xmm0 658; AVX512F_32-NEXT: vmovsd %xmm0, (%esp) 659; AVX512F_32-NEXT: fldl (%esp) 660; AVX512F_32-NEXT: movl %ebp, %esp 661; AVX512F_32-NEXT: popl %ebp 662; AVX512F_32-NEXT: retl 663; 664; SSE2_32-LABEL: u64_to_d: 665; SSE2_32: # %bb.0: 666; SSE2_32-NEXT: pushl %ebp 667; SSE2_32-NEXT: movl %esp, %ebp 668; SSE2_32-NEXT: andl $-8, %esp 669; SSE2_32-NEXT: subl $8, %esp 670; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 671; SSE2_32-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] 672; SSE2_32-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 673; SSE2_32-NEXT: movapd %xmm0, %xmm1 674; SSE2_32-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 675; SSE2_32-NEXT: addsd %xmm0, %xmm1 676; SSE2_32-NEXT: movsd %xmm1, (%esp) 677; SSE2_32-NEXT: fldl (%esp) 678; SSE2_32-NEXT: movl %ebp, %esp 679; SSE2_32-NEXT: popl %ebp 680; SSE2_32-NEXT: retl 681; 682; SSE2_64-LABEL: u64_to_d: 683; SSE2_64: # %bb.0: 684; SSE2_64-NEXT: movq %rdi, %xmm1 685; SSE2_64-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] 686; SSE2_64-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 687; SSE2_64-NEXT: movapd %xmm1, %xmm0 688; SSE2_64-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 689; SSE2_64-NEXT: addsd %xmm1, %xmm0 690; SSE2_64-NEXT: retq 691; 692; SSE1_32-LABEL: u64_to_d: 693; SSE1_32: # %bb.0: 694; SSE1_32-NEXT: pushl %ebp 695; SSE1_32-NEXT: movl %esp, %ebp 696; SSE1_32-NEXT: andl $-8, %esp 697; SSE1_32-NEXT: subl $16, %esp 698; SSE1_32-NEXT: movl 8(%ebp), %eax 699; SSE1_32-NEXT: movl 12(%ebp), %ecx 700; SSE1_32-NEXT: movl %ecx, {{[0-9]+}}(%esp) 701; SSE1_32-NEXT: movl %eax, (%esp) 702; SSE1_32-NEXT: shrl $31, %ecx 703; SSE1_32-NEXT: fildll (%esp) 704; SSE1_32-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 705; SSE1_32-NEXT: fstpl {{[0-9]+}}(%esp) 706; SSE1_32-NEXT: fldl {{[0-9]+}}(%esp) 707; SSE1_32-NEXT: movl %ebp, %esp 708; SSE1_32-NEXT: popl %ebp 709; SSE1_32-NEXT: retl 710; 711; X87-LABEL: u64_to_d: 712; X87: # %bb.0: 713; X87-NEXT: pushl %ebp 714; X87-NEXT: movl %esp, %ebp 715; X87-NEXT: andl $-8, %esp 716; X87-NEXT: subl $16, %esp 717; X87-NEXT: movl 8(%ebp), %eax 718; X87-NEXT: movl 12(%ebp), %ecx 719; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp) 720; X87-NEXT: movl %eax, (%esp) 721; X87-NEXT: shrl $31, %ecx 722; X87-NEXT: fildll (%esp) 723; X87-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 724; X87-NEXT: fstpl {{[0-9]+}}(%esp) 725; X87-NEXT: fldl {{[0-9]+}}(%esp) 726; X87-NEXT: movl %ebp, %esp 727; X87-NEXT: popl %ebp 728; X87-NEXT: retl 729 %r = uitofp i64 %a to double 730 ret double %r 731} 732 733define double @u64_to_d_optsize(i64 %a) nounwind optsize { 734; AVX512DQVL_32-LABEL: u64_to_d_optsize: 735; AVX512DQVL_32: # %bb.0: 736; AVX512DQVL_32-NEXT: pushl %ebp 737; AVX512DQVL_32-NEXT: movl %esp, %ebp 738; AVX512DQVL_32-NEXT: andl $-8, %esp 739; AVX512DQVL_32-NEXT: subl $8, %esp 740; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 741; AVX512DQVL_32-NEXT: vcvtuqq2pd %ymm0, %ymm0 742; AVX512DQVL_32-NEXT: vmovlps %xmm0, (%esp) 743; AVX512DQVL_32-NEXT: fldl (%esp) 744; AVX512DQVL_32-NEXT: movl %ebp, %esp 745; AVX512DQVL_32-NEXT: popl %ebp 746; AVX512DQVL_32-NEXT: vzeroupper 747; AVX512DQVL_32-NEXT: retl 748; 749; AVX512_64-LABEL: u64_to_d_optsize: 750; AVX512_64: # %bb.0: 751; AVX512_64-NEXT: vcvtusi2sd %rdi, %xmm0, %xmm0 752; AVX512_64-NEXT: retq 753; 754; AVX512DQ_32-LABEL: u64_to_d_optsize: 755; AVX512DQ_32: # %bb.0: 756; AVX512DQ_32-NEXT: pushl %ebp 757; AVX512DQ_32-NEXT: movl %esp, %ebp 758; AVX512DQ_32-NEXT: andl $-8, %esp 759; AVX512DQ_32-NEXT: subl $8, %esp 760; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 761; AVX512DQ_32-NEXT: vcvtuqq2pd %zmm0, %zmm0 762; AVX512DQ_32-NEXT: vmovlps %xmm0, (%esp) 763; AVX512DQ_32-NEXT: fldl (%esp) 764; AVX512DQ_32-NEXT: movl %ebp, %esp 765; AVX512DQ_32-NEXT: popl %ebp 766; AVX512DQ_32-NEXT: vzeroupper 767; AVX512DQ_32-NEXT: retl 768; 769; AVX512F_32-LABEL: u64_to_d_optsize: 770; AVX512F_32: # %bb.0: 771; AVX512F_32-NEXT: pushl %ebp 772; AVX512F_32-NEXT: movl %esp, %ebp 773; AVX512F_32-NEXT: andl $-8, %esp 774; AVX512F_32-NEXT: subl $8, %esp 775; AVX512F_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 776; AVX512F_32-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] 777; AVX512F_32-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 778; AVX512F_32-NEXT: vhaddpd %xmm0, %xmm0, %xmm0 779; AVX512F_32-NEXT: vmovlpd %xmm0, (%esp) 780; AVX512F_32-NEXT: fldl (%esp) 781; AVX512F_32-NEXT: movl %ebp, %esp 782; AVX512F_32-NEXT: popl %ebp 783; AVX512F_32-NEXT: retl 784; 785; SSE2_32-LABEL: u64_to_d_optsize: 786; SSE2_32: # %bb.0: 787; SSE2_32-NEXT: pushl %ebp 788; SSE2_32-NEXT: movl %esp, %ebp 789; SSE2_32-NEXT: andl $-8, %esp 790; SSE2_32-NEXT: subl $8, %esp 791; SSE2_32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 792; SSE2_32-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] 793; SSE2_32-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 794; SSE2_32-NEXT: movapd %xmm0, %xmm1 795; SSE2_32-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 796; SSE2_32-NEXT: addsd %xmm0, %xmm1 797; SSE2_32-NEXT: movsd %xmm1, (%esp) 798; SSE2_32-NEXT: fldl (%esp) 799; SSE2_32-NEXT: movl %ebp, %esp 800; SSE2_32-NEXT: popl %ebp 801; SSE2_32-NEXT: retl 802; 803; SSE2_64-LABEL: u64_to_d_optsize: 804; SSE2_64: # %bb.0: 805; SSE2_64-NEXT: movq %rdi, %xmm1 806; SSE2_64-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] 807; SSE2_64-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 808; SSE2_64-NEXT: movapd %xmm1, %xmm0 809; SSE2_64-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 810; SSE2_64-NEXT: addsd %xmm1, %xmm0 811; SSE2_64-NEXT: retq 812; 813; SSE1_32-LABEL: u64_to_d_optsize: 814; SSE1_32: # %bb.0: 815; SSE1_32-NEXT: pushl %ebp 816; SSE1_32-NEXT: movl %esp, %ebp 817; SSE1_32-NEXT: andl $-8, %esp 818; SSE1_32-NEXT: subl $16, %esp 819; SSE1_32-NEXT: movl 8(%ebp), %eax 820; SSE1_32-NEXT: movl 12(%ebp), %ecx 821; SSE1_32-NEXT: movl %ecx, {{[0-9]+}}(%esp) 822; SSE1_32-NEXT: movl %eax, (%esp) 823; SSE1_32-NEXT: shrl $31, %ecx 824; SSE1_32-NEXT: fildll (%esp) 825; SSE1_32-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 826; SSE1_32-NEXT: fstpl {{[0-9]+}}(%esp) 827; SSE1_32-NEXT: fldl {{[0-9]+}}(%esp) 828; SSE1_32-NEXT: movl %ebp, %esp 829; SSE1_32-NEXT: popl %ebp 830; SSE1_32-NEXT: retl 831; 832; X87-LABEL: u64_to_d_optsize: 833; X87: # %bb.0: 834; X87-NEXT: pushl %ebp 835; X87-NEXT: movl %esp, %ebp 836; X87-NEXT: andl $-8, %esp 837; X87-NEXT: subl $16, %esp 838; X87-NEXT: movl 8(%ebp), %eax 839; X87-NEXT: movl 12(%ebp), %ecx 840; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp) 841; X87-NEXT: movl %eax, (%esp) 842; X87-NEXT: shrl $31, %ecx 843; X87-NEXT: fildll (%esp) 844; X87-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 845; X87-NEXT: fstpl {{[0-9]+}}(%esp) 846; X87-NEXT: fldl {{[0-9]+}}(%esp) 847; X87-NEXT: movl %ebp, %esp 848; X87-NEXT: popl %ebp 849; X87-NEXT: retl 850 %r = uitofp i64 %a to double 851 ret double %r 852} 853 854define double @s64_to_d(i64 %a) nounwind { 855; AVX512DQVL_32-LABEL: s64_to_d: 856; AVX512DQVL_32: # %bb.0: 857; AVX512DQVL_32-NEXT: pushl %ebp 858; AVX512DQVL_32-NEXT: movl %esp, %ebp 859; AVX512DQVL_32-NEXT: andl $-8, %esp 860; AVX512DQVL_32-NEXT: subl $8, %esp 861; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 862; AVX512DQVL_32-NEXT: vcvtqq2pd %ymm0, %ymm0 863; AVX512DQVL_32-NEXT: vmovlps %xmm0, (%esp) 864; AVX512DQVL_32-NEXT: fldl (%esp) 865; AVX512DQVL_32-NEXT: movl %ebp, %esp 866; AVX512DQVL_32-NEXT: popl %ebp 867; AVX512DQVL_32-NEXT: vzeroupper 868; AVX512DQVL_32-NEXT: retl 869; 870; AVX512_64-LABEL: s64_to_d: 871; AVX512_64: # %bb.0: 872; AVX512_64-NEXT: vcvtsi2sd %rdi, %xmm0, %xmm0 873; AVX512_64-NEXT: retq 874; 875; AVX512DQ_32-LABEL: s64_to_d: 876; AVX512DQ_32: # %bb.0: 877; AVX512DQ_32-NEXT: pushl %ebp 878; AVX512DQ_32-NEXT: movl %esp, %ebp 879; AVX512DQ_32-NEXT: andl $-8, %esp 880; AVX512DQ_32-NEXT: subl $8, %esp 881; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 882; AVX512DQ_32-NEXT: vcvtqq2pd %zmm0, %zmm0 883; AVX512DQ_32-NEXT: vmovlps %xmm0, (%esp) 884; AVX512DQ_32-NEXT: fldl (%esp) 885; AVX512DQ_32-NEXT: movl %ebp, %esp 886; AVX512DQ_32-NEXT: popl %ebp 887; AVX512DQ_32-NEXT: vzeroupper 888; AVX512DQ_32-NEXT: retl 889; 890; AVX512F_32-LABEL: s64_to_d: 891; AVX512F_32: # %bb.0: 892; AVX512F_32-NEXT: pushl %ebp 893; AVX512F_32-NEXT: movl %esp, %ebp 894; AVX512F_32-NEXT: andl $-8, %esp 895; AVX512F_32-NEXT: subl $8, %esp 896; AVX512F_32-NEXT: fildll 8(%ebp) 897; AVX512F_32-NEXT: fstpl (%esp) 898; AVX512F_32-NEXT: fldl (%esp) 899; AVX512F_32-NEXT: movl %ebp, %esp 900; AVX512F_32-NEXT: popl %ebp 901; AVX512F_32-NEXT: retl 902; 903; SSE2_32-LABEL: s64_to_d: 904; SSE2_32: # %bb.0: 905; SSE2_32-NEXT: pushl %ebp 906; SSE2_32-NEXT: movl %esp, %ebp 907; SSE2_32-NEXT: andl $-8, %esp 908; SSE2_32-NEXT: subl $8, %esp 909; SSE2_32-NEXT: fildll 8(%ebp) 910; SSE2_32-NEXT: fstpl (%esp) 911; SSE2_32-NEXT: fldl (%esp) 912; SSE2_32-NEXT: movl %ebp, %esp 913; SSE2_32-NEXT: popl %ebp 914; SSE2_32-NEXT: retl 915; 916; SSE2_64-LABEL: s64_to_d: 917; SSE2_64: # %bb.0: 918; SSE2_64-NEXT: cvtsi2sd %rdi, %xmm0 919; SSE2_64-NEXT: retq 920; 921; SSE1_32-LABEL: s64_to_d: 922; SSE1_32: # %bb.0: 923; SSE1_32-NEXT: fildll {{[0-9]+}}(%esp) 924; SSE1_32-NEXT: retl 925; 926; X87-LABEL: s64_to_d: 927; X87: # %bb.0: 928; X87-NEXT: fildll {{[0-9]+}}(%esp) 929; X87-NEXT: retl 930 %r = sitofp i64 %a to double 931 ret double %r 932} 933 934define double @s64_to_d_2(i64 %a) nounwind { 935; AVX512DQVL_32-LABEL: s64_to_d_2: 936; AVX512DQVL_32: # %bb.0: 937; AVX512DQVL_32-NEXT: pushl %ebp 938; AVX512DQVL_32-NEXT: movl %esp, %ebp 939; AVX512DQVL_32-NEXT: andl $-8, %esp 940; AVX512DQVL_32-NEXT: subl $8, %esp 941; AVX512DQVL_32-NEXT: movl 8(%ebp), %eax 942; AVX512DQVL_32-NEXT: movl 12(%ebp), %ecx 943; AVX512DQVL_32-NEXT: addl $5, %eax 944; AVX512DQVL_32-NEXT: adcl $0, %ecx 945; AVX512DQVL_32-NEXT: vmovd %eax, %xmm0 946; AVX512DQVL_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0 947; AVX512DQVL_32-NEXT: vcvtqq2pd %ymm0, %ymm0 948; AVX512DQVL_32-NEXT: vmovlps %xmm0, (%esp) 949; AVX512DQVL_32-NEXT: fldl (%esp) 950; AVX512DQVL_32-NEXT: movl %ebp, %esp 951; AVX512DQVL_32-NEXT: popl %ebp 952; AVX512DQVL_32-NEXT: vzeroupper 953; AVX512DQVL_32-NEXT: retl 954; 955; AVX512_64-LABEL: s64_to_d_2: 956; AVX512_64: # %bb.0: 957; AVX512_64-NEXT: addq $5, %rdi 958; AVX512_64-NEXT: vcvtsi2sd %rdi, %xmm0, %xmm0 959; AVX512_64-NEXT: retq 960; 961; AVX512DQ_32-LABEL: s64_to_d_2: 962; AVX512DQ_32: # %bb.0: 963; AVX512DQ_32-NEXT: pushl %ebp 964; AVX512DQ_32-NEXT: movl %esp, %ebp 965; AVX512DQ_32-NEXT: andl $-8, %esp 966; AVX512DQ_32-NEXT: subl $8, %esp 967; AVX512DQ_32-NEXT: movl 8(%ebp), %eax 968; AVX512DQ_32-NEXT: movl 12(%ebp), %ecx 969; AVX512DQ_32-NEXT: addl $5, %eax 970; AVX512DQ_32-NEXT: adcl $0, %ecx 971; AVX512DQ_32-NEXT: vmovd %eax, %xmm0 972; AVX512DQ_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0 973; AVX512DQ_32-NEXT: vcvtqq2pd %zmm0, %zmm0 974; AVX512DQ_32-NEXT: vmovlps %xmm0, (%esp) 975; AVX512DQ_32-NEXT: fldl (%esp) 976; AVX512DQ_32-NEXT: movl %ebp, %esp 977; AVX512DQ_32-NEXT: popl %ebp 978; AVX512DQ_32-NEXT: vzeroupper 979; AVX512DQ_32-NEXT: retl 980; 981; AVX512F_32-LABEL: s64_to_d_2: 982; AVX512F_32: # %bb.0: 983; AVX512F_32-NEXT: pushl %ebp 984; AVX512F_32-NEXT: movl %esp, %ebp 985; AVX512F_32-NEXT: andl $-8, %esp 986; AVX512F_32-NEXT: subl $16, %esp 987; AVX512F_32-NEXT: movl 8(%ebp), %eax 988; AVX512F_32-NEXT: movl 12(%ebp), %ecx 989; AVX512F_32-NEXT: addl $5, %eax 990; AVX512F_32-NEXT: adcl $0, %ecx 991; AVX512F_32-NEXT: vmovd %eax, %xmm0 992; AVX512F_32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0 993; AVX512F_32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp) 994; AVX512F_32-NEXT: fildll {{[0-9]+}}(%esp) 995; AVX512F_32-NEXT: fstpl (%esp) 996; AVX512F_32-NEXT: fldl (%esp) 997; AVX512F_32-NEXT: movl %ebp, %esp 998; AVX512F_32-NEXT: popl %ebp 999; AVX512F_32-NEXT: retl 1000; 1001; SSE2_32-LABEL: s64_to_d_2: 1002; SSE2_32: # %bb.0: 1003; SSE2_32-NEXT: pushl %ebp 1004; SSE2_32-NEXT: movl %esp, %ebp 1005; SSE2_32-NEXT: andl $-8, %esp 1006; SSE2_32-NEXT: subl $16, %esp 1007; SSE2_32-NEXT: movl 8(%ebp), %eax 1008; SSE2_32-NEXT: movl 12(%ebp), %ecx 1009; SSE2_32-NEXT: addl $5, %eax 1010; SSE2_32-NEXT: adcl $0, %ecx 1011; SSE2_32-NEXT: movd %ecx, %xmm0 1012; SSE2_32-NEXT: movd %eax, %xmm1 1013; SSE2_32-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1014; SSE2_32-NEXT: movq %xmm1, {{[0-9]+}}(%esp) 1015; SSE2_32-NEXT: fildll {{[0-9]+}}(%esp) 1016; SSE2_32-NEXT: fstpl (%esp) 1017; SSE2_32-NEXT: fldl (%esp) 1018; SSE2_32-NEXT: movl %ebp, %esp 1019; SSE2_32-NEXT: popl %ebp 1020; SSE2_32-NEXT: retl 1021; 1022; SSE2_64-LABEL: s64_to_d_2: 1023; SSE2_64: # %bb.0: 1024; SSE2_64-NEXT: addq $5, %rdi 1025; SSE2_64-NEXT: cvtsi2sd %rdi, %xmm0 1026; SSE2_64-NEXT: retq 1027; 1028; SSE1_32-LABEL: s64_to_d_2: 1029; SSE1_32: # %bb.0: 1030; SSE1_32-NEXT: pushl %ebp 1031; SSE1_32-NEXT: movl %esp, %ebp 1032; SSE1_32-NEXT: andl $-8, %esp 1033; SSE1_32-NEXT: subl $8, %esp 1034; SSE1_32-NEXT: movl 8(%ebp), %eax 1035; SSE1_32-NEXT: movl 12(%ebp), %ecx 1036; SSE1_32-NEXT: addl $5, %eax 1037; SSE1_32-NEXT: adcl $0, %ecx 1038; SSE1_32-NEXT: movl %eax, (%esp) 1039; SSE1_32-NEXT: movl %ecx, {{[0-9]+}}(%esp) 1040; SSE1_32-NEXT: fildll (%esp) 1041; SSE1_32-NEXT: movl %ebp, %esp 1042; SSE1_32-NEXT: popl %ebp 1043; SSE1_32-NEXT: retl 1044; 1045; X87-LABEL: s64_to_d_2: 1046; X87: # %bb.0: 1047; X87-NEXT: pushl %ebp 1048; X87-NEXT: movl %esp, %ebp 1049; X87-NEXT: andl $-8, %esp 1050; X87-NEXT: subl $8, %esp 1051; X87-NEXT: movl 8(%ebp), %eax 1052; X87-NEXT: movl 12(%ebp), %ecx 1053; X87-NEXT: addl $5, %eax 1054; X87-NEXT: adcl $0, %ecx 1055; X87-NEXT: movl %eax, (%esp) 1056; X87-NEXT: movl %ecx, {{[0-9]+}}(%esp) 1057; X87-NEXT: fildll (%esp) 1058; X87-NEXT: movl %ebp, %esp 1059; X87-NEXT: popl %ebp 1060; X87-NEXT: retl 1061 %b = add i64 %a, 5 1062 %f = sitofp i64 %b to double 1063 ret double %f 1064} 1065 1066define x86_fp80 @u64_to_x(i64 %a) nounwind { 1067; CHECK32-LABEL: u64_to_x: 1068; CHECK32: # %bb.0: 1069; CHECK32-NEXT: pushl %ebp 1070; CHECK32-NEXT: movl %esp, %ebp 1071; CHECK32-NEXT: andl $-8, %esp 1072; CHECK32-NEXT: subl $8, %esp 1073; CHECK32-NEXT: movl 8(%ebp), %eax 1074; CHECK32-NEXT: movl 12(%ebp), %ecx 1075; CHECK32-NEXT: movl %ecx, {{[0-9]+}}(%esp) 1076; CHECK32-NEXT: movl %eax, (%esp) 1077; CHECK32-NEXT: shrl $31, %ecx 1078; CHECK32-NEXT: fildll (%esp) 1079; CHECK32-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4) 1080; CHECK32-NEXT: movl %ebp, %esp 1081; CHECK32-NEXT: popl %ebp 1082; CHECK32-NEXT: retl 1083; 1084; CHECK64-LABEL: u64_to_x: 1085; CHECK64: # %bb.0: 1086; CHECK64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) 1087; CHECK64-NEXT: xorl %eax, %eax 1088; CHECK64-NEXT: testq %rdi, %rdi 1089; CHECK64-NEXT: sets %al 1090; CHECK64-NEXT: fildll -{{[0-9]+}}(%rsp) 1091; CHECK64-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%rax,4) 1092; CHECK64-NEXT: retq 1093 %r = uitofp i64 %a to x86_fp80 1094 ret x86_fp80 %r 1095} 1096 1097define x86_fp80 @s64_to_x(i64 %a) nounwind { 1098; CHECK32-LABEL: s64_to_x: 1099; CHECK32: # %bb.0: 1100; CHECK32-NEXT: fildll {{[0-9]+}}(%esp) 1101; CHECK32-NEXT: retl 1102; 1103; CHECK64-LABEL: s64_to_x: 1104; CHECK64: # %bb.0: 1105; CHECK64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) 1106; CHECK64-NEXT: fildll -{{[0-9]+}}(%rsp) 1107; CHECK64-NEXT: retq 1108 %r = sitofp i64 %a to x86_fp80 1109 ret x86_fp80 %r 1110} 1111