279 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE23; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX4; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx512f -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX5; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2_X866; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX_X867; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+avx512f -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX_X868 9 10define double @int_to_double_rr(i32 %a) {11; SSE2-LABEL: int_to_double_rr:12; SSE2: # %bb.0: # %entry13; SSE2-NEXT: cvtsi2sd %edi, %xmm014; SSE2-NEXT: retq15;16; AVX-LABEL: int_to_double_rr:17; AVX: # %bb.0: # %entry18; AVX-NEXT: vcvtsi2sd %edi, %xmm15, %xmm019; AVX-NEXT: retq20;21; SSE2_X86-LABEL: int_to_double_rr:22; SSE2_X86: # %bb.0: # %entry23; SSE2_X86-NEXT: pushl %ebp24; SSE2_X86-NEXT: .cfi_def_cfa_offset 825; SSE2_X86-NEXT: .cfi_offset %ebp, -826; SSE2_X86-NEXT: movl %esp, %ebp27; SSE2_X86-NEXT: .cfi_def_cfa_register %ebp28; SSE2_X86-NEXT: andl $-8, %esp29; SSE2_X86-NEXT: subl $8, %esp30; SSE2_X86-NEXT: cvtsi2sdl 8(%ebp), %xmm031; SSE2_X86-NEXT: movsd %xmm0, (%esp)32; SSE2_X86-NEXT: fldl (%esp)33; SSE2_X86-NEXT: movl %ebp, %esp34; SSE2_X86-NEXT: popl %ebp35; SSE2_X86-NEXT: .cfi_def_cfa %esp, 436; SSE2_X86-NEXT: retl37;38; AVX_X86-LABEL: int_to_double_rr:39; AVX_X86: # %bb.0: # %entry40; AVX_X86-NEXT: pushl %ebp41; AVX_X86-NEXT: .cfi_def_cfa_offset 842; AVX_X86-NEXT: .cfi_offset %ebp, -843; AVX_X86-NEXT: movl %esp, %ebp44; AVX_X86-NEXT: .cfi_def_cfa_register %ebp45; AVX_X86-NEXT: andl $-8, %esp46; AVX_X86-NEXT: subl $8, %esp47; AVX_X86-NEXT: vcvtsi2sdl 8(%ebp), %xmm7, %xmm048; AVX_X86-NEXT: vmovsd %xmm0, (%esp)49; AVX_X86-NEXT: fldl (%esp)50; AVX_X86-NEXT: movl %ebp, %esp51; AVX_X86-NEXT: popl %ebp52; AVX_X86-NEXT: .cfi_def_cfa %esp, 453; AVX_X86-NEXT: retl54entry:55 %0 = sitofp i32 %a to double56 ret double %057}58 59define double @int_to_double_rm(ptr %a) {60; SSE2-LABEL: int_to_double_rm:61; SSE2: # %bb.0: # %entry62; SSE2-NEXT: cvtsi2sdl (%rdi), %xmm063; SSE2-NEXT: retq64;65; AVX-LABEL: int_to_double_rm:66; AVX: # %bb.0: # %entry67; AVX-NEXT: vcvtsi2sdl (%rdi), %xmm15, %xmm068; AVX-NEXT: retq69;70; SSE2_X86-LABEL: int_to_double_rm:71; SSE2_X86: # %bb.0: # %entry72; SSE2_X86-NEXT: pushl %ebp73; SSE2_X86-NEXT: .cfi_def_cfa_offset 874; SSE2_X86-NEXT: .cfi_offset %ebp, -875; SSE2_X86-NEXT: movl %esp, %ebp76; SSE2_X86-NEXT: .cfi_def_cfa_register %ebp77; SSE2_X86-NEXT: andl $-8, %esp78; SSE2_X86-NEXT: subl $8, %esp79; SSE2_X86-NEXT: movl 8(%ebp), %eax80; SSE2_X86-NEXT: cvtsi2sdl (%eax), %xmm081; SSE2_X86-NEXT: movsd %xmm0, (%esp)82; SSE2_X86-NEXT: fldl (%esp)83; SSE2_X86-NEXT: movl %ebp, %esp84; SSE2_X86-NEXT: popl %ebp85; SSE2_X86-NEXT: .cfi_def_cfa %esp, 486; SSE2_X86-NEXT: retl87;88; AVX_X86-LABEL: int_to_double_rm:89; AVX_X86: # %bb.0: # %entry90; AVX_X86-NEXT: pushl %ebp91; AVX_X86-NEXT: .cfi_def_cfa_offset 892; AVX_X86-NEXT: .cfi_offset %ebp, -893; AVX_X86-NEXT: movl %esp, %ebp94; AVX_X86-NEXT: .cfi_def_cfa_register %ebp95; AVX_X86-NEXT: andl $-8, %esp96; AVX_X86-NEXT: subl $8, %esp97; AVX_X86-NEXT: movl 8(%ebp), %eax98; AVX_X86-NEXT: vcvtsi2sdl (%eax), %xmm7, %xmm099; AVX_X86-NEXT: vmovsd %xmm0, (%esp)100; AVX_X86-NEXT: fldl (%esp)101; AVX_X86-NEXT: movl %ebp, %esp102; AVX_X86-NEXT: popl %ebp103; AVX_X86-NEXT: .cfi_def_cfa %esp, 4104; AVX_X86-NEXT: retl105entry:106 %0 = load i32, ptr %a107 %1 = sitofp i32 %0 to double108 ret double %1109}110 111define double @int_to_double_rm_optsize(ptr %a) optsize {112; SSE2-LABEL: int_to_double_rm_optsize:113; SSE2: # %bb.0: # %entry114; SSE2-NEXT: cvtsi2sdl (%rdi), %xmm0115; SSE2-NEXT: retq116;117; AVX-LABEL: int_to_double_rm_optsize:118; AVX: # %bb.0: # %entry119; AVX-NEXT: vcvtsi2sdl (%rdi), %xmm15, %xmm0120; AVX-NEXT: retq121;122; SSE2_X86-LABEL: int_to_double_rm_optsize:123; SSE2_X86: # %bb.0: # %entry124; SSE2_X86-NEXT: pushl %ebp125; SSE2_X86-NEXT: .cfi_def_cfa_offset 8126; SSE2_X86-NEXT: .cfi_offset %ebp, -8127; SSE2_X86-NEXT: movl %esp, %ebp128; SSE2_X86-NEXT: .cfi_def_cfa_register %ebp129; SSE2_X86-NEXT: andl $-8, %esp130; SSE2_X86-NEXT: subl $8, %esp131; SSE2_X86-NEXT: movl 8(%ebp), %eax132; SSE2_X86-NEXT: cvtsi2sdl (%eax), %xmm0133; SSE2_X86-NEXT: movsd %xmm0, (%esp)134; SSE2_X86-NEXT: fldl (%esp)135; SSE2_X86-NEXT: movl %ebp, %esp136; SSE2_X86-NEXT: popl %ebp137; SSE2_X86-NEXT: .cfi_def_cfa %esp, 4138; SSE2_X86-NEXT: retl139;140; AVX_X86-LABEL: int_to_double_rm_optsize:141; AVX_X86: # %bb.0: # %entry142; AVX_X86-NEXT: pushl %ebp143; AVX_X86-NEXT: .cfi_def_cfa_offset 8144; AVX_X86-NEXT: .cfi_offset %ebp, -8145; AVX_X86-NEXT: movl %esp, %ebp146; AVX_X86-NEXT: .cfi_def_cfa_register %ebp147; AVX_X86-NEXT: andl $-8, %esp148; AVX_X86-NEXT: subl $8, %esp149; AVX_X86-NEXT: movl 8(%ebp), %eax150; AVX_X86-NEXT: vcvtsi2sdl (%eax), %xmm7, %xmm0151; AVX_X86-NEXT: vmovsd %xmm0, (%esp)152; AVX_X86-NEXT: fldl (%esp)153; AVX_X86-NEXT: movl %ebp, %esp154; AVX_X86-NEXT: popl %ebp155; AVX_X86-NEXT: .cfi_def_cfa %esp, 4156; AVX_X86-NEXT: retl157entry:158 %0 = load i32, ptr %a159 %1 = sitofp i32 %0 to double160 ret double %1161}162 163define float @int_to_float_rr(i32 %a) {164; SSE2-LABEL: int_to_float_rr:165; SSE2: # %bb.0: # %entry166; SSE2-NEXT: cvtsi2ss %edi, %xmm0167; SSE2-NEXT: retq168;169; AVX-LABEL: int_to_float_rr:170; AVX: # %bb.0: # %entry171; AVX-NEXT: vcvtsi2ss %edi, %xmm15, %xmm0172; AVX-NEXT: retq173;174; SSE2_X86-LABEL: int_to_float_rr:175; SSE2_X86: # %bb.0: # %entry176; SSE2_X86-NEXT: pushl %eax177; SSE2_X86-NEXT: .cfi_def_cfa_offset 8178; SSE2_X86-NEXT: cvtsi2ssl {{[0-9]+}}(%esp), %xmm0179; SSE2_X86-NEXT: movss %xmm0, (%esp)180; SSE2_X86-NEXT: flds (%esp)181; SSE2_X86-NEXT: popl %eax182; SSE2_X86-NEXT: .cfi_def_cfa_offset 4183; SSE2_X86-NEXT: retl184;185; AVX_X86-LABEL: int_to_float_rr:186; AVX_X86: # %bb.0: # %entry187; AVX_X86-NEXT: pushl %eax188; AVX_X86-NEXT: .cfi_def_cfa_offset 8189; AVX_X86-NEXT: vcvtsi2ssl {{[0-9]+}}(%esp), %xmm7, %xmm0190; AVX_X86-NEXT: vmovss %xmm0, (%esp)191; AVX_X86-NEXT: flds (%esp)192; AVX_X86-NEXT: popl %eax193; AVX_X86-NEXT: .cfi_def_cfa_offset 4194; AVX_X86-NEXT: retl195entry:196 %0 = sitofp i32 %a to float197 ret float %0198}199 200define float @int_to_float_rm(ptr %a) {201; SSE2-LABEL: int_to_float_rm:202; SSE2: # %bb.0: # %entry203; SSE2-NEXT: cvtsi2ssl (%rdi), %xmm0204; SSE2-NEXT: retq205;206; AVX-LABEL: int_to_float_rm:207; AVX: # %bb.0: # %entry208; AVX-NEXT: vcvtsi2ssl (%rdi), %xmm15, %xmm0209; AVX-NEXT: retq210;211; SSE2_X86-LABEL: int_to_float_rm:212; SSE2_X86: # %bb.0: # %entry213; SSE2_X86-NEXT: pushl %eax214; SSE2_X86-NEXT: .cfi_def_cfa_offset 8215; SSE2_X86-NEXT: movl {{[0-9]+}}(%esp), %eax216; SSE2_X86-NEXT: cvtsi2ssl (%eax), %xmm0217; SSE2_X86-NEXT: movss %xmm0, (%esp)218; SSE2_X86-NEXT: flds (%esp)219; SSE2_X86-NEXT: popl %eax220; SSE2_X86-NEXT: .cfi_def_cfa_offset 4221; SSE2_X86-NEXT: retl222;223; AVX_X86-LABEL: int_to_float_rm:224; AVX_X86: # %bb.0: # %entry225; AVX_X86-NEXT: pushl %eax226; AVX_X86-NEXT: .cfi_def_cfa_offset 8227; AVX_X86-NEXT: movl {{[0-9]+}}(%esp), %eax228; AVX_X86-NEXT: vcvtsi2ssl (%eax), %xmm7, %xmm0229; AVX_X86-NEXT: vmovss %xmm0, (%esp)230; AVX_X86-NEXT: flds (%esp)231; AVX_X86-NEXT: popl %eax232; AVX_X86-NEXT: .cfi_def_cfa_offset 4233; AVX_X86-NEXT: retl234entry:235 %0 = load i32, ptr %a236 %1 = sitofp i32 %0 to float237 ret float %1238}239 240define float @int_to_float_rm_optsize(ptr %a) optsize {241; SSE2-LABEL: int_to_float_rm_optsize:242; SSE2: # %bb.0: # %entry243; SSE2-NEXT: cvtsi2ssl (%rdi), %xmm0244; SSE2-NEXT: retq245;246; AVX-LABEL: int_to_float_rm_optsize:247; AVX: # %bb.0: # %entry248; AVX-NEXT: vcvtsi2ssl (%rdi), %xmm15, %xmm0249; AVX-NEXT: retq250;251; SSE2_X86-LABEL: int_to_float_rm_optsize:252; SSE2_X86: # %bb.0: # %entry253; SSE2_X86-NEXT: pushl %eax254; SSE2_X86-NEXT: .cfi_def_cfa_offset 8255; SSE2_X86-NEXT: movl {{[0-9]+}}(%esp), %eax256; SSE2_X86-NEXT: cvtsi2ssl (%eax), %xmm0257; SSE2_X86-NEXT: movss %xmm0, (%esp)258; SSE2_X86-NEXT: flds (%esp)259; SSE2_X86-NEXT: popl %eax260; SSE2_X86-NEXT: .cfi_def_cfa_offset 4261; SSE2_X86-NEXT: retl262;263; AVX_X86-LABEL: int_to_float_rm_optsize:264; AVX_X86: # %bb.0: # %entry265; AVX_X86-NEXT: pushl %eax266; AVX_X86-NEXT: .cfi_def_cfa_offset 8267; AVX_X86-NEXT: movl {{[0-9]+}}(%esp), %eax268; AVX_X86-NEXT: vcvtsi2ssl (%eax), %xmm7, %xmm0269; AVX_X86-NEXT: vmovss %xmm0, (%esp)270; AVX_X86-NEXT: flds (%esp)271; AVX_X86-NEXT: popl %eax272; AVX_X86-NEXT: .cfi_def_cfa_offset 4273; AVX_X86-NEXT: retl274entry:275 %0 = load i32, ptr %a276 %1 = sitofp i32 %0 to float277 ret float %1278}279