1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2 3; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX 4; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2_X86 5; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX_X86 6 7 8define double @int_to_double_rr(i32 %a) { 9; SSE2-LABEL: int_to_double_rr: 10; SSE2: # BB#0: # %entry 11; SSE2-NEXT: cvtsi2sdl %edi, %xmm0 12; SSE2-NEXT: retq 13; 14; AVX-LABEL: int_to_double_rr: 15; AVX: # BB#0: # %entry 16; AVX-NEXT: vcvtsi2sdl %edi, %xmm0, %xmm0 17; AVX-NEXT: retq 18; 19; SSE2_X86-LABEL: int_to_double_rr: 20; SSE2_X86: # BB#0: # %entry 21; SSE2_X86-NEXT: pushl %ebp 22; SSE2_X86-NEXT: .cfi_def_cfa_offset 8 23; SSE2_X86-NEXT: .cfi_offset %ebp, -8 24; SSE2_X86-NEXT: movl %esp, %ebp 25; SSE2_X86-NEXT: .cfi_def_cfa_register %ebp 26; SSE2_X86-NEXT: andl $-8, %esp 27; SSE2_X86-NEXT: subl $8, %esp 28; SSE2_X86-NEXT: movl 8(%ebp), %eax 29; SSE2_X86-NEXT: cvtsi2sdl %eax, %xmm0 30; SSE2_X86-NEXT: movsd %xmm0, (%esp) 31; SSE2_X86-NEXT: fldl (%esp) 32; SSE2_X86-NEXT: movl %ebp, %esp 33; SSE2_X86-NEXT: popl %ebp 34; SSE2_X86-NEXT: .cfi_def_cfa %esp, 4 35; SSE2_X86-NEXT: retl 36; 37; AVX_X86-LABEL: int_to_double_rr: 38; AVX_X86: # BB#0: # %entry 39; AVX_X86-NEXT: pushl %ebp 40; AVX_X86-NEXT: .cfi_def_cfa_offset 8 41; AVX_X86-NEXT: .cfi_offset %ebp, -8 42; AVX_X86-NEXT: movl %esp, %ebp 43; AVX_X86-NEXT: .cfi_def_cfa_register %ebp 44; AVX_X86-NEXT: andl $-8, %esp 45; AVX_X86-NEXT: subl $8, %esp 46; AVX_X86-NEXT: vcvtsi2sdl 8(%ebp), %xmm0, %xmm0 47; AVX_X86-NEXT: vmovsd %xmm0, (%esp) 48; AVX_X86-NEXT: fldl (%esp) 49; AVX_X86-NEXT: movl %ebp, %esp 50; AVX_X86-NEXT: popl %ebp 51; AVX_X86-NEXT: .cfi_def_cfa %esp, 4 52; AVX_X86-NEXT: retl 53entry: 54 %0 = sitofp i32 %a to double 55 ret double %0 56} 57 58define double @int_to_double_rm(i32* %a) { 59; SSE2-LABEL: int_to_double_rm: 60; SSE2: # BB#0: # %entry 61; SSE2-NEXT: movl (%rdi), %eax 62; SSE2-NEXT: cvtsi2sdl %eax, %xmm0 63; SSE2-NEXT: retq 64; 65; AVX-LABEL: int_to_double_rm: 66; AVX: # BB#0: # %entry 67; AVX-NEXT: vcvtsi2sdl (%rdi), %xmm0, %xmm0 68; AVX-NEXT: retq 69; 70; SSE2_X86-LABEL: int_to_double_rm: 71; SSE2_X86: # BB#0: # %entry 72; SSE2_X86-NEXT: pushl %ebp 73; SSE2_X86-NEXT: .cfi_def_cfa_offset 8 74; SSE2_X86-NEXT: .cfi_offset %ebp, -8 75; SSE2_X86-NEXT: movl %esp, %ebp 76; SSE2_X86-NEXT: .cfi_def_cfa_register %ebp 77; SSE2_X86-NEXT: andl $-8, %esp 78; SSE2_X86-NEXT: subl $8, %esp 79; SSE2_X86-NEXT: movl 8(%ebp), %eax 80; SSE2_X86-NEXT: cvtsi2sdl (%eax), %xmm0 81; SSE2_X86-NEXT: movsd %xmm0, (%esp) 82; SSE2_X86-NEXT: fldl (%esp) 83; SSE2_X86-NEXT: movl %ebp, %esp 84; SSE2_X86-NEXT: popl %ebp 85; SSE2_X86-NEXT: .cfi_def_cfa %esp, 4 86; SSE2_X86-NEXT: retl 87; 88; AVX_X86-LABEL: int_to_double_rm: 89; AVX_X86: # BB#0: # %entry 90; AVX_X86-NEXT: pushl %ebp 91; AVX_X86-NEXT: .cfi_def_cfa_offset 8 92; AVX_X86-NEXT: .cfi_offset %ebp, -8 93; AVX_X86-NEXT: movl %esp, %ebp 94; AVX_X86-NEXT: .cfi_def_cfa_register %ebp 95; AVX_X86-NEXT: andl $-8, %esp 96; AVX_X86-NEXT: subl $8, %esp 97; AVX_X86-NEXT: movl 8(%ebp), %eax 98; AVX_X86-NEXT: vcvtsi2sdl (%eax), %xmm0, %xmm0 99; AVX_X86-NEXT: vmovsd %xmm0, (%esp) 100; AVX_X86-NEXT: fldl (%esp) 101; AVX_X86-NEXT: movl %ebp, %esp 102; AVX_X86-NEXT: popl %ebp 103; AVX_X86-NEXT: .cfi_def_cfa %esp, 4 104; AVX_X86-NEXT: retl 105entry: 106 %0 = load i32, i32* %a 107 %1 = sitofp i32 %0 to double 108 ret double %1 109} 110 111define double @int_to_double_rm_optsize(i32* %a) optsize { 112; SSE2-LABEL: int_to_double_rm_optsize: 113; SSE2: # BB#0: # %entry 114; SSE2-NEXT: cvtsi2sdl (%rdi), %xmm0 115; SSE2-NEXT: retq 116; 117; AVX-LABEL: int_to_double_rm_optsize: 118; AVX: # BB#0: # %entry 119; AVX-NEXT: vcvtsi2sdl (%rdi), %xmm0, %xmm0 120; AVX-NEXT: retq 121; 122; SSE2_X86-LABEL: int_to_double_rm_optsize: 123; SSE2_X86: # BB#0: # %entry 124; SSE2_X86-NEXT: pushl %ebp 125; SSE2_X86-NEXT: .cfi_def_cfa_offset 8 126; SSE2_X86-NEXT: .cfi_offset %ebp, -8 127; SSE2_X86-NEXT: movl %esp, %ebp 128; SSE2_X86-NEXT: .cfi_def_cfa_register %ebp 129; SSE2_X86-NEXT: andl $-8, %esp 130; SSE2_X86-NEXT: subl $8, %esp 131; SSE2_X86-NEXT: movl 8(%ebp), %eax 132; SSE2_X86-NEXT: cvtsi2sdl (%eax), %xmm0 133; SSE2_X86-NEXT: movsd %xmm0, (%esp) 134; SSE2_X86-NEXT: fldl (%esp) 135; SSE2_X86-NEXT: movl %ebp, %esp 136; SSE2_X86-NEXT: popl %ebp 137; SSE2_X86-NEXT: .cfi_def_cfa %esp, 4 138; SSE2_X86-NEXT: retl 139; 140; AVX_X86-LABEL: int_to_double_rm_optsize: 141; AVX_X86: # BB#0: # %entry 142; AVX_X86-NEXT: pushl %ebp 143; AVX_X86-NEXT: .cfi_def_cfa_offset 8 144; AVX_X86-NEXT: .cfi_offset %ebp, -8 145; AVX_X86-NEXT: movl %esp, %ebp 146; AVX_X86-NEXT: .cfi_def_cfa_register %ebp 147; AVX_X86-NEXT: andl $-8, %esp 148; AVX_X86-NEXT: subl $8, %esp 149; AVX_X86-NEXT: movl 8(%ebp), %eax 150; AVX_X86-NEXT: vcvtsi2sdl (%eax), %xmm0, %xmm0 151; AVX_X86-NEXT: vmovsd %xmm0, (%esp) 152; AVX_X86-NEXT: fldl (%esp) 153; AVX_X86-NEXT: movl %ebp, %esp 154; AVX_X86-NEXT: popl %ebp 155; AVX_X86-NEXT: .cfi_def_cfa %esp, 4 156; AVX_X86-NEXT: retl 157entry: 158 %0 = load i32, i32* %a 159 %1 = sitofp i32 %0 to double 160 ret double %1 161} 162 163define float @int_to_float_rr(i32 %a) { 164; SSE2-LABEL: int_to_float_rr: 165; SSE2: # BB#0: # %entry 166; SSE2-NEXT: cvtsi2ssl %edi, %xmm0 167; SSE2-NEXT: retq 168; 169; AVX-LABEL: int_to_float_rr: 170; AVX: # BB#0: # %entry 171; AVX-NEXT: vcvtsi2ssl %edi, %xmm0, %xmm0 172; AVX-NEXT: retq 173; 174; SSE2_X86-LABEL: int_to_float_rr: 175; SSE2_X86: # BB#0: # %entry 176; SSE2_X86-NEXT: pushl %eax 177; SSE2_X86-NEXT: .cfi_def_cfa_offset 8 178; SSE2_X86-NEXT: movl {{[0-9]+}}(%esp), %eax 179; SSE2_X86-NEXT: cvtsi2ssl %eax, %xmm0 180; SSE2_X86-NEXT: movss %xmm0, (%esp) 181; SSE2_X86-NEXT: flds (%esp) 182; SSE2_X86-NEXT: popl %eax 183; SSE2_X86-NEXT: .cfi_def_cfa_offset 4 184; SSE2_X86-NEXT: retl 185; 186; AVX_X86-LABEL: int_to_float_rr: 187; AVX_X86: # BB#0: # %entry 188; AVX_X86-NEXT: pushl %eax 189; AVX_X86-NEXT: .cfi_def_cfa_offset 8 190; AVX_X86-NEXT: vcvtsi2ssl {{[0-9]+}}(%esp), %xmm0, %xmm0 191; AVX_X86-NEXT: vmovss %xmm0, (%esp) 192; AVX_X86-NEXT: flds (%esp) 193; AVX_X86-NEXT: popl %eax 194; AVX_X86-NEXT: .cfi_def_cfa_offset 4 195; AVX_X86-NEXT: retl 196entry: 197 %0 = sitofp i32 %a to float 198 ret float %0 199} 200 201define float @int_to_float_rm(i32* %a) { 202; SSE2-LABEL: int_to_float_rm: 203; SSE2: # BB#0: # %entry 204; SSE2-NEXT: movl (%rdi), %eax 205; SSE2-NEXT: cvtsi2ssl %eax, %xmm0 206; SSE2-NEXT: retq 207; 208; AVX-LABEL: int_to_float_rm: 209; AVX: # BB#0: # %entry 210; AVX-NEXT: vcvtsi2ssl (%rdi), %xmm0, %xmm0 211; AVX-NEXT: retq 212; 213; SSE2_X86-LABEL: int_to_float_rm: 214; SSE2_X86: # BB#0: # %entry 215; SSE2_X86-NEXT: pushl %eax 216; SSE2_X86-NEXT: .cfi_def_cfa_offset 8 217; SSE2_X86-NEXT: movl {{[0-9]+}}(%esp), %eax 218; SSE2_X86-NEXT: cvtsi2ssl (%eax), %xmm0 219; SSE2_X86-NEXT: movss %xmm0, (%esp) 220; SSE2_X86-NEXT: flds (%esp) 221; SSE2_X86-NEXT: popl %eax 222; SSE2_X86-NEXT: .cfi_def_cfa_offset 4 223; SSE2_X86-NEXT: retl 224; 225; AVX_X86-LABEL: int_to_float_rm: 226; AVX_X86: # BB#0: # %entry 227; AVX_X86-NEXT: pushl %eax 228; AVX_X86-NEXT: .cfi_def_cfa_offset 8 229; AVX_X86-NEXT: movl {{[0-9]+}}(%esp), %eax 230; AVX_X86-NEXT: vcvtsi2ssl (%eax), %xmm0, %xmm0 231; AVX_X86-NEXT: vmovss %xmm0, (%esp) 232; AVX_X86-NEXT: flds (%esp) 233; AVX_X86-NEXT: popl %eax 234; AVX_X86-NEXT: .cfi_def_cfa_offset 4 235; AVX_X86-NEXT: retl 236entry: 237 %0 = load i32, i32* %a 238 %1 = sitofp i32 %0 to float 239 ret float %1 240} 241 242define float @int_to_float_rm_optsize(i32* %a) optsize { 243; SSE2-LABEL: int_to_float_rm_optsize: 244; SSE2: # BB#0: # %entry 245; SSE2-NEXT: cvtsi2ssl (%rdi), %xmm0 246; SSE2-NEXT: retq 247; 248; AVX-LABEL: int_to_float_rm_optsize: 249; AVX: # BB#0: # %entry 250; AVX-NEXT: vcvtsi2ssl (%rdi), %xmm0, %xmm0 251; AVX-NEXT: retq 252; 253; SSE2_X86-LABEL: int_to_float_rm_optsize: 254; SSE2_X86: # BB#0: # %entry 255; SSE2_X86-NEXT: pushl %eax 256; SSE2_X86-NEXT: .cfi_def_cfa_offset 8 257; SSE2_X86-NEXT: movl {{[0-9]+}}(%esp), %eax 258; SSE2_X86-NEXT: cvtsi2ssl (%eax), %xmm0 259; SSE2_X86-NEXT: movss %xmm0, (%esp) 260; SSE2_X86-NEXT: flds (%esp) 261; SSE2_X86-NEXT: popl %eax 262; SSE2_X86-NEXT: .cfi_def_cfa_offset 4 263; SSE2_X86-NEXT: retl 264; 265; AVX_X86-LABEL: int_to_float_rm_optsize: 266; AVX_X86: # BB#0: # %entry 267; AVX_X86-NEXT: pushl %eax 268; AVX_X86-NEXT: .cfi_def_cfa_offset 8 269; AVX_X86-NEXT: movl {{[0-9]+}}(%esp), %eax 270; AVX_X86-NEXT: vcvtsi2ssl (%eax), %xmm0, %xmm0 271; AVX_X86-NEXT: vmovss %xmm0, (%esp) 272; AVX_X86-NEXT: flds (%esp) 273; AVX_X86-NEXT: popl %eax 274; AVX_X86-NEXT: .cfi_def_cfa_offset 4 275; AVX_X86-NEXT: retl 276entry: 277 %0 = load i32, i32* %a 278 %1 = sitofp i32 %0 to float 279 ret float %1 280} 281