393 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefixes=X86,X86-NOSSE3; RUN: llc < %s -mtriple=i686-unknown -mattr=sse2 | FileCheck %s --check-prefixes=X86,X86-SSE24; RUN: llc < %s -mtriple=i686-unknown -mattr=avx | FileCheck %s --check-prefixes=X86,X86-AVX5; RUN: llc < %s -mtriple=i686-unknown -mattr=avx512f | FileCheck %s --check-prefixes=X86,X86-AVX6; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefixes=X64,X64-SSE7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX8; RUN: llc < %s -mtriple=x86_64-unknown -mattr=avx512f | FileCheck %s --check-prefixes=X64,X64-AVX9 10; FIXME: crash11; define i64 @test_llrint_i64_f16(half %x) nounwind {12; entry:13; %0 = tail call i64 @llvm.llrint.i64.f16(half %x)14; ret i64 %015; }16 17define i64 @test_llrint_i64_f32(float %x) nounwind {18; X86-NOSSE-LABEL: test_llrint_i64_f32:19; X86-NOSSE: # %bb.0: # %entry20; X86-NOSSE-NEXT: pushl %ebp21; X86-NOSSE-NEXT: movl %esp, %ebp22; X86-NOSSE-NEXT: andl $-8, %esp23; X86-NOSSE-NEXT: subl $8, %esp24; X86-NOSSE-NEXT: flds 8(%ebp)25; X86-NOSSE-NEXT: fistpll (%esp)26; X86-NOSSE-NEXT: movl (%esp), %eax27; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %edx28; X86-NOSSE-NEXT: movl %ebp, %esp29; X86-NOSSE-NEXT: popl %ebp30; X86-NOSSE-NEXT: retl31;32; X86-SSE2-LABEL: test_llrint_i64_f32:33; X86-SSE2: # %bb.0: # %entry34; X86-SSE2-NEXT: pushl %ebp35; X86-SSE2-NEXT: movl %esp, %ebp36; X86-SSE2-NEXT: andl $-8, %esp37; X86-SSE2-NEXT: subl $8, %esp38; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero39; X86-SSE2-NEXT: movss %xmm0, (%esp)40; X86-SSE2-NEXT: flds (%esp)41; X86-SSE2-NEXT: fistpll (%esp)42; X86-SSE2-NEXT: movl (%esp), %eax43; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %edx44; X86-SSE2-NEXT: movl %ebp, %esp45; X86-SSE2-NEXT: popl %ebp46; X86-SSE2-NEXT: retl47;48; X86-AVX-LABEL: test_llrint_i64_f32:49; X86-AVX: # %bb.0: # %entry50; X86-AVX-NEXT: pushl %ebp51; X86-AVX-NEXT: movl %esp, %ebp52; X86-AVX-NEXT: andl $-8, %esp53; X86-AVX-NEXT: subl $8, %esp54; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero55; X86-AVX-NEXT: vmovss %xmm0, (%esp)56; X86-AVX-NEXT: flds (%esp)57; X86-AVX-NEXT: fistpll (%esp)58; X86-AVX-NEXT: movl (%esp), %eax59; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx60; X86-AVX-NEXT: movl %ebp, %esp61; X86-AVX-NEXT: popl %ebp62; X86-AVX-NEXT: retl63;64; X64-SSE-LABEL: test_llrint_i64_f32:65; X64-SSE: # %bb.0: # %entry66; X64-SSE-NEXT: cvtss2si %xmm0, %rax67; X64-SSE-NEXT: retq68;69; X64-AVX-LABEL: test_llrint_i64_f32:70; X64-AVX: # %bb.0: # %entry71; X64-AVX-NEXT: vcvtss2si %xmm0, %rax72; X64-AVX-NEXT: retq73entry:74 %0 = tail call i64 @llvm.llrint.i64.f32(float %x)75 ret i64 %076}77 78define i64 @test_llrint_i64_f64(double %x) nounwind {79; X86-NOSSE-LABEL: test_llrint_i64_f64:80; X86-NOSSE: # %bb.0: # %entry81; X86-NOSSE-NEXT: pushl %ebp82; X86-NOSSE-NEXT: movl %esp, %ebp83; X86-NOSSE-NEXT: andl $-8, %esp84; X86-NOSSE-NEXT: subl $8, %esp85; X86-NOSSE-NEXT: fldl 8(%ebp)86; X86-NOSSE-NEXT: fistpll (%esp)87; X86-NOSSE-NEXT: movl (%esp), %eax88; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %edx89; X86-NOSSE-NEXT: movl %ebp, %esp90; X86-NOSSE-NEXT: popl %ebp91; X86-NOSSE-NEXT: retl92;93; X86-SSE2-LABEL: test_llrint_i64_f64:94; X86-SSE2: # %bb.0: # %entry95; X86-SSE2-NEXT: pushl %ebp96; X86-SSE2-NEXT: movl %esp, %ebp97; X86-SSE2-NEXT: andl $-8, %esp98; X86-SSE2-NEXT: subl $8, %esp99; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero100; X86-SSE2-NEXT: movsd %xmm0, (%esp)101; X86-SSE2-NEXT: fldl (%esp)102; X86-SSE2-NEXT: fistpll (%esp)103; X86-SSE2-NEXT: movl (%esp), %eax104; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %edx105; X86-SSE2-NEXT: movl %ebp, %esp106; X86-SSE2-NEXT: popl %ebp107; X86-SSE2-NEXT: retl108;109; X86-AVX-LABEL: test_llrint_i64_f64:110; X86-AVX: # %bb.0: # %entry111; X86-AVX-NEXT: pushl %ebp112; X86-AVX-NEXT: movl %esp, %ebp113; X86-AVX-NEXT: andl $-8, %esp114; X86-AVX-NEXT: subl $8, %esp115; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero116; X86-AVX-NEXT: vmovsd %xmm0, (%esp)117; X86-AVX-NEXT: fldl (%esp)118; X86-AVX-NEXT: fistpll (%esp)119; X86-AVX-NEXT: movl (%esp), %eax120; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx121; X86-AVX-NEXT: movl %ebp, %esp122; X86-AVX-NEXT: popl %ebp123; X86-AVX-NEXT: retl124;125; X64-SSE-LABEL: test_llrint_i64_f64:126; X64-SSE: # %bb.0: # %entry127; X64-SSE-NEXT: cvtsd2si %xmm0, %rax128; X64-SSE-NEXT: retq129;130; X64-AVX-LABEL: test_llrint_i64_f64:131; X64-AVX: # %bb.0: # %entry132; X64-AVX-NEXT: vcvtsd2si %xmm0, %rax133; X64-AVX-NEXT: retq134entry:135 %0 = tail call i64 @llvm.llrint.i64.f64(double %x)136 ret i64 %0137}138 139define i64 @test_llrint_i64_f80(x86_fp80 %x) nounwind {140; X86-LABEL: test_llrint_i64_f80:141; X86: # %bb.0: # %entry142; X86-NEXT: pushl %ebp143; X86-NEXT: movl %esp, %ebp144; X86-NEXT: andl $-8, %esp145; X86-NEXT: subl $8, %esp146; X86-NEXT: fldt 8(%ebp)147; X86-NEXT: fistpll (%esp)148; X86-NEXT: movl (%esp), %eax149; X86-NEXT: movl {{[0-9]+}}(%esp), %edx150; X86-NEXT: movl %ebp, %esp151; X86-NEXT: popl %ebp152; X86-NEXT: retl153;154; X64-LABEL: test_llrint_i64_f80:155; X64: # %bb.0: # %entry156; X64-NEXT: fldt {{[0-9]+}}(%rsp)157; X64-NEXT: fistpll -{{[0-9]+}}(%rsp)158; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax159; X64-NEXT: retq160entry:161 %0 = tail call i64 @llvm.llrint.i64.f80(x86_fp80 %x)162 ret i64 %0163}164 165; FIXME(#44744): incorrect libcall166define i64 @test_llrint_i64_f128(fp128 %x) nounwind {167; X86-NOSSE-LABEL: test_llrint_i64_f128:168; X86-NOSSE: # %bb.0: # %entry169; X86-NOSSE-NEXT: pushl %ebp170; X86-NOSSE-NEXT: movl %esp, %ebp171; X86-NOSSE-NEXT: andl $-16, %esp172; X86-NOSSE-NEXT: subl $16, %esp173; X86-NOSSE-NEXT: pushl 20(%ebp)174; X86-NOSSE-NEXT: pushl 16(%ebp)175; X86-NOSSE-NEXT: pushl 12(%ebp)176; X86-NOSSE-NEXT: pushl 8(%ebp)177; X86-NOSSE-NEXT: calll llrintl178; X86-NOSSE-NEXT: addl $16, %esp179; X86-NOSSE-NEXT: movl %ebp, %esp180; X86-NOSSE-NEXT: popl %ebp181; X86-NOSSE-NEXT: retl182;183; X86-SSE2-LABEL: test_llrint_i64_f128:184; X86-SSE2: # %bb.0: # %entry185; X86-SSE2-NEXT: pushl %ebp186; X86-SSE2-NEXT: movl %esp, %ebp187; X86-SSE2-NEXT: andl $-16, %esp188; X86-SSE2-NEXT: subl $16, %esp189; X86-SSE2-NEXT: pushl 20(%ebp)190; X86-SSE2-NEXT: pushl 16(%ebp)191; X86-SSE2-NEXT: pushl 12(%ebp)192; X86-SSE2-NEXT: pushl 8(%ebp)193; X86-SSE2-NEXT: calll llrintl194; X86-SSE2-NEXT: addl $16, %esp195; X86-SSE2-NEXT: movl %ebp, %esp196; X86-SSE2-NEXT: popl %ebp197; X86-SSE2-NEXT: retl198;199; X86-AVX-LABEL: test_llrint_i64_f128:200; X86-AVX: # %bb.0: # %entry201; X86-AVX-NEXT: pushl %ebp202; X86-AVX-NEXT: movl %esp, %ebp203; X86-AVX-NEXT: andl $-16, %esp204; X86-AVX-NEXT: subl $32, %esp205; X86-AVX-NEXT: vmovups 8(%ebp), %xmm0206; X86-AVX-NEXT: vmovups %xmm0, (%esp)207; X86-AVX-NEXT: calll llrintl208; X86-AVX-NEXT: movl %ebp, %esp209; X86-AVX-NEXT: popl %ebp210; X86-AVX-NEXT: retl211;212; X64-LABEL: test_llrint_i64_f128:213; X64: # %bb.0: # %entry214; X64-NEXT: jmp llrintl@PLT # TAILCALL215entry:216 %0 = tail call i64 @llvm.llrint.i64.f128(fp128 %x)217 ret i64 %0218}219 220; FIXME: crash221; define i64 @test_llrint_i64_f16_strict(half %x) nounwind strictfp {222; entry:223; %0 = tail call i64 @llvm.experimental.constrained.llrint.i64.f16(half %x, metadata!"round.dynamic", metadata!"fpexcept.strict")224; ret i64 %0225; }226 227define i64 @test_llrint_i64_f32_strict(float %x) nounwind strictfp {228; X86-NOSSE-LABEL: test_llrint_i64_f32_strict:229; X86-NOSSE: # %bb.0: # %entry230; X86-NOSSE-NEXT: pushl %eax231; X86-NOSSE-NEXT: flds {{[0-9]+}}(%esp)232; X86-NOSSE-NEXT: fstps (%esp)233; X86-NOSSE-NEXT: wait234; X86-NOSSE-NEXT: calll llrintf235; X86-NOSSE-NEXT: popl %ecx236; X86-NOSSE-NEXT: retl237;238; X86-SSE2-LABEL: test_llrint_i64_f32_strict:239; X86-SSE2: # %bb.0: # %entry240; X86-SSE2-NEXT: pushl %eax241; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero242; X86-SSE2-NEXT: movss %xmm0, (%esp)243; X86-SSE2-NEXT: calll llrintf244; X86-SSE2-NEXT: popl %ecx245; X86-SSE2-NEXT: retl246;247; X86-AVX-LABEL: test_llrint_i64_f32_strict:248; X86-AVX: # %bb.0: # %entry249; X86-AVX-NEXT: pushl %eax250; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero251; X86-AVX-NEXT: vmovss %xmm0, (%esp)252; X86-AVX-NEXT: calll llrintf253; X86-AVX-NEXT: popl %ecx254; X86-AVX-NEXT: retl255;256; X64-LABEL: test_llrint_i64_f32_strict:257; X64: # %bb.0: # %entry258; X64-NEXT: pushq %rax259; X64-NEXT: callq llrintf@PLT260; X64-NEXT: popq %rcx261; X64-NEXT: retq262entry:263 %0 = tail call i64 @llvm.experimental.constrained.llrint.i64.f32(float %x, metadata!"round.dynamic", metadata!"fpexcept.strict")264 ret i64 %0265}266 267define i64 @test_llrint_i64_f64_strict(double %x) nounwind strictfp {268; X86-NOSSE-LABEL: test_llrint_i64_f64_strict:269; X86-NOSSE: # %bb.0: # %entry270; X86-NOSSE-NEXT: subl $8, %esp271; X86-NOSSE-NEXT: fldl {{[0-9]+}}(%esp)272; X86-NOSSE-NEXT: fstpl (%esp)273; X86-NOSSE-NEXT: wait274; X86-NOSSE-NEXT: calll llrint275; X86-NOSSE-NEXT: addl $8, %esp276; X86-NOSSE-NEXT: retl277;278; X86-SSE2-LABEL: test_llrint_i64_f64_strict:279; X86-SSE2: # %bb.0: # %entry280; X86-SSE2-NEXT: subl $8, %esp281; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero282; X86-SSE2-NEXT: movsd %xmm0, (%esp)283; X86-SSE2-NEXT: calll llrint284; X86-SSE2-NEXT: addl $8, %esp285; X86-SSE2-NEXT: retl286;287; X86-AVX-LABEL: test_llrint_i64_f64_strict:288; X86-AVX: # %bb.0: # %entry289; X86-AVX-NEXT: subl $8, %esp290; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero291; X86-AVX-NEXT: vmovsd %xmm0, (%esp)292; X86-AVX-NEXT: calll llrint293; X86-AVX-NEXT: addl $8, %esp294; X86-AVX-NEXT: retl295;296; X64-LABEL: test_llrint_i64_f64_strict:297; X64: # %bb.0: # %entry298; X64-NEXT: pushq %rax299; X64-NEXT: callq llrint@PLT300; X64-NEXT: popq %rcx301; X64-NEXT: retq302entry:303 %0 = tail call i64 @llvm.experimental.constrained.llrint.i64.f64(double %x, metadata!"round.dynamic", metadata!"fpexcept.strict")304 ret i64 %0305}306 307define i64 @test_llrint_i64_f80_strict(x86_fp80 %x) nounwind strictfp {308; X86-LABEL: test_llrint_i64_f80_strict:309; X86: # %bb.0: # %entry310; X86-NEXT: subl $12, %esp311; X86-NEXT: fldt {{[0-9]+}}(%esp)312; X86-NEXT: fstpt (%esp)313; X86-NEXT: wait314; X86-NEXT: calll llrintl315; X86-NEXT: addl $12, %esp316; X86-NEXT: retl317;318; X64-LABEL: test_llrint_i64_f80_strict:319; X64: # %bb.0: # %entry320; X64-NEXT: subq $24, %rsp321; X64-NEXT: fldt {{[0-9]+}}(%rsp)322; X64-NEXT: fstpt (%rsp)323; X64-NEXT: wait324; X64-NEXT: callq llrintl@PLT325; X64-NEXT: addq $24, %rsp326; X64-NEXT: retq327entry:328 %0 = tail call i64 @llvm.experimental.constrained.llrint.i64.f80(x86_fp80 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")329 ret i64 %0330}331 332; FIXME(#44744): incorrect libcall333define i64 @test_llrint_i64_f128_strict(fp128 %x) nounwind strictfp {334; X86-NOSSE-LABEL: test_llrint_i64_f128_strict:335; X86-NOSSE: # %bb.0: # %entry336; X86-NOSSE-NEXT: pushl %ebp337; X86-NOSSE-NEXT: movl %esp, %ebp338; X86-NOSSE-NEXT: andl $-16, %esp339; X86-NOSSE-NEXT: subl $16, %esp340; X86-NOSSE-NEXT: pushl 20(%ebp)341; X86-NOSSE-NEXT: pushl 16(%ebp)342; X86-NOSSE-NEXT: pushl 12(%ebp)343; X86-NOSSE-NEXT: pushl 8(%ebp)344; X86-NOSSE-NEXT: calll llrintl345; X86-NOSSE-NEXT: addl $16, %esp346; X86-NOSSE-NEXT: movl %ebp, %esp347; X86-NOSSE-NEXT: popl %ebp348; X86-NOSSE-NEXT: retl349;350; X86-SSE2-LABEL: test_llrint_i64_f128_strict:351; X86-SSE2: # %bb.0: # %entry352; X86-SSE2-NEXT: pushl %ebp353; X86-SSE2-NEXT: movl %esp, %ebp354; X86-SSE2-NEXT: andl $-16, %esp355; X86-SSE2-NEXT: subl $16, %esp356; X86-SSE2-NEXT: pushl 20(%ebp)357; X86-SSE2-NEXT: pushl 16(%ebp)358; X86-SSE2-NEXT: pushl 12(%ebp)359; X86-SSE2-NEXT: pushl 8(%ebp)360; X86-SSE2-NEXT: calll llrintl361; X86-SSE2-NEXT: addl $16, %esp362; X86-SSE2-NEXT: movl %ebp, %esp363; X86-SSE2-NEXT: popl %ebp364; X86-SSE2-NEXT: retl365;366; X86-AVX-LABEL: test_llrint_i64_f128_strict:367; X86-AVX: # %bb.0: # %entry368; X86-AVX-NEXT: pushl %ebp369; X86-AVX-NEXT: movl %esp, %ebp370; X86-AVX-NEXT: andl $-16, %esp371; X86-AVX-NEXT: subl $32, %esp372; X86-AVX-NEXT: vmovups 8(%ebp), %xmm0373; X86-AVX-NEXT: vmovups %xmm0, (%esp)374; X86-AVX-NEXT: calll llrintl375; X86-AVX-NEXT: movl %ebp, %esp376; X86-AVX-NEXT: popl %ebp377; X86-AVX-NEXT: retl378;379; X64-LABEL: test_llrint_i64_f128_strict:380; X64: # %bb.0: # %entry381; X64-NEXT: pushq %rax382; X64-NEXT: callq llrintl@PLT383; X64-NEXT: popq %rcx384; X64-NEXT: retq385entry:386 %0 = tail call i64 @llvm.experimental.constrained.llrint.i64.f128(fp128 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")387 ret i64 %0388}389 390declare i64 @llvm.llrint.i64.f32(float) nounwind readnone391declare i64 @llvm.llrint.i64.f64(double) nounwind readnone392declare i64 @llvm.llrint.i64.f80(x86_fp80) nounwind readnone393