325 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 i32 @test_lrint_i32_f16(half %x) nounwind {12; entry:13; %0 = tail call i32 @llvm.lrint.i32.f16(half %x)14; ret i32 %015; }16 17define i32 @test_lrint_i32_f32(float %x) nounwind {18; X86-NOSSE-LABEL: test_lrint_i32_f32:19; X86-NOSSE: # %bb.0:20; X86-NOSSE-NEXT: pushl %eax21; X86-NOSSE-NEXT: flds {{[0-9]+}}(%esp)22; X86-NOSSE-NEXT: fistpl (%esp)23; X86-NOSSE-NEXT: movl (%esp), %eax24; X86-NOSSE-NEXT: popl %ecx25; X86-NOSSE-NEXT: retl26;27; X86-SSE2-LABEL: test_lrint_i32_f32:28; X86-SSE2: # %bb.0:29; X86-SSE2-NEXT: cvtss2si {{[0-9]+}}(%esp), %eax30; X86-SSE2-NEXT: retl31;32; X86-AVX-LABEL: test_lrint_i32_f32:33; X86-AVX: # %bb.0:34; X86-AVX-NEXT: vcvtss2si {{[0-9]+}}(%esp), %eax35; X86-AVX-NEXT: retl36;37; X64-SSE-LABEL: test_lrint_i32_f32:38; X64-SSE: # %bb.0:39; X64-SSE-NEXT: cvtss2si %xmm0, %eax40; X64-SSE-NEXT: retq41;42; X64-AVX-LABEL: test_lrint_i32_f32:43; X64-AVX: # %bb.0:44; X64-AVX-NEXT: vcvtss2si %xmm0, %eax45; X64-AVX-NEXT: retq46 %conv = tail call i32 @llvm.lrint.i32.f32(float %x)47 ret i32 %conv48}49 50define i32 @test_lrint_i32_f64(double %x) nounwind {51; X86-NOSSE-LABEL: test_lrint_i32_f64:52; X86-NOSSE: # %bb.0:53; X86-NOSSE-NEXT: pushl %eax54; X86-NOSSE-NEXT: fldl {{[0-9]+}}(%esp)55; X86-NOSSE-NEXT: fistpl (%esp)56; X86-NOSSE-NEXT: movl (%esp), %eax57; X86-NOSSE-NEXT: popl %ecx58; X86-NOSSE-NEXT: retl59;60; X86-SSE2-LABEL: test_lrint_i32_f64:61; X86-SSE2: # %bb.0:62; X86-SSE2-NEXT: cvtsd2si {{[0-9]+}}(%esp), %eax63; X86-SSE2-NEXT: retl64;65; X86-AVX-LABEL: test_lrint_i32_f64:66; X86-AVX: # %bb.0:67; X86-AVX-NEXT: vcvtsd2si {{[0-9]+}}(%esp), %eax68; X86-AVX-NEXT: retl69;70; X64-SSE-LABEL: test_lrint_i32_f64:71; X64-SSE: # %bb.0:72; X64-SSE-NEXT: cvtsd2si %xmm0, %eax73; X64-SSE-NEXT: retq74;75; X64-AVX-LABEL: test_lrint_i32_f64:76; X64-AVX: # %bb.0:77; X64-AVX-NEXT: vcvtsd2si %xmm0, %eax78; X64-AVX-NEXT: retq79 %conv = tail call i32 @llvm.lrint.i32.f64(double %x)80 ret i32 %conv81}82 83define i32 @test_lrint_i32_f80(x86_fp80 %x) nounwind {84; X86-LABEL: test_lrint_i32_f80:85; X86: # %bb.0:86; X86-NEXT: pushl %eax87; X86-NEXT: fldt {{[0-9]+}}(%esp)88; X86-NEXT: fistpl (%esp)89; X86-NEXT: movl (%esp), %eax90; X86-NEXT: popl %ecx91; X86-NEXT: retl92;93; X64-LABEL: test_lrint_i32_f80:94; X64: # %bb.0:95; X64-NEXT: fldt {{[0-9]+}}(%rsp)96; X64-NEXT: fistpl -{{[0-9]+}}(%rsp)97; X64-NEXT: movl -{{[0-9]+}}(%rsp), %eax98; X64-NEXT: retq99 %conv = tail call i32 @llvm.lrint.i32.f80(x86_fp80 %x)100 ret i32 %conv101}102 103; FIXME(#44744): incorrect libcall104define i32 @test_lrint_i32_f128(fp128 %x) nounwind {105; X86-NOSSE-LABEL: test_lrint_i32_f128:106; X86-NOSSE: # %bb.0:107; X86-NOSSE-NEXT: pushl %ebp108; X86-NOSSE-NEXT: movl %esp, %ebp109; X86-NOSSE-NEXT: andl $-16, %esp110; X86-NOSSE-NEXT: subl $16, %esp111; X86-NOSSE-NEXT: pushl 20(%ebp)112; X86-NOSSE-NEXT: pushl 16(%ebp)113; X86-NOSSE-NEXT: pushl 12(%ebp)114; X86-NOSSE-NEXT: pushl 8(%ebp)115; X86-NOSSE-NEXT: calll lrintl116; X86-NOSSE-NEXT: addl $16, %esp117; X86-NOSSE-NEXT: movl %ebp, %esp118; X86-NOSSE-NEXT: popl %ebp119; X86-NOSSE-NEXT: retl120;121; X86-SSE2-LABEL: test_lrint_i32_f128:122; X86-SSE2: # %bb.0:123; X86-SSE2-NEXT: pushl %ebp124; X86-SSE2-NEXT: movl %esp, %ebp125; X86-SSE2-NEXT: andl $-16, %esp126; X86-SSE2-NEXT: subl $16, %esp127; X86-SSE2-NEXT: pushl 20(%ebp)128; X86-SSE2-NEXT: pushl 16(%ebp)129; X86-SSE2-NEXT: pushl 12(%ebp)130; X86-SSE2-NEXT: pushl 8(%ebp)131; X86-SSE2-NEXT: calll lrintl132; X86-SSE2-NEXT: addl $16, %esp133; X86-SSE2-NEXT: movl %ebp, %esp134; X86-SSE2-NEXT: popl %ebp135; X86-SSE2-NEXT: retl136;137; X86-AVX-LABEL: test_lrint_i32_f128:138; X86-AVX: # %bb.0:139; X86-AVX-NEXT: pushl %ebp140; X86-AVX-NEXT: movl %esp, %ebp141; X86-AVX-NEXT: andl $-16, %esp142; X86-AVX-NEXT: subl $32, %esp143; X86-AVX-NEXT: vmovups 8(%ebp), %xmm0144; X86-AVX-NEXT: vmovups %xmm0, (%esp)145; X86-AVX-NEXT: calll lrintl146; X86-AVX-NEXT: movl %ebp, %esp147; X86-AVX-NEXT: popl %ebp148; X86-AVX-NEXT: retl149;150; X64-LABEL: test_lrint_i32_f128:151; X64: # %bb.0:152; X64-NEXT: jmp lrintl@PLT # TAILCALL153 %conv = tail call i32 @llvm.lrint.i32.f128(fp128 %x)154 ret i32 %conv155}156 157; FIXME: crash158; define i32 @test_lrint_i32_f16_strict(half %x) nounwind strictfp {159; %conv = tail call i32 @llvm.experimental.constrained.lrint.i32.f16(half %x, metadata!"round.dynamic", metadata!"fpexcept.strict")160; ret i32 %conv161; }162 163define i32 @test_lrint_i32_f32_strict(float %x) nounwind strictfp {164; X86-NOSSE-LABEL: test_lrint_i32_f32_strict:165; X86-NOSSE: # %bb.0:166; X86-NOSSE-NEXT: pushl %eax167; X86-NOSSE-NEXT: flds {{[0-9]+}}(%esp)168; X86-NOSSE-NEXT: fstps (%esp)169; X86-NOSSE-NEXT: wait170; X86-NOSSE-NEXT: calll lrintf171; X86-NOSSE-NEXT: popl %ecx172; X86-NOSSE-NEXT: retl173;174; X86-SSE2-LABEL: test_lrint_i32_f32_strict:175; X86-SSE2: # %bb.0:176; X86-SSE2-NEXT: pushl %eax177; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero178; X86-SSE2-NEXT: movss %xmm0, (%esp)179; X86-SSE2-NEXT: calll lrintf180; X86-SSE2-NEXT: popl %ecx181; X86-SSE2-NEXT: retl182;183; X86-AVX-LABEL: test_lrint_i32_f32_strict:184; X86-AVX: # %bb.0:185; X86-AVX-NEXT: pushl %eax186; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero187; X86-AVX-NEXT: vmovss %xmm0, (%esp)188; X86-AVX-NEXT: calll lrintf189; X86-AVX-NEXT: popl %ecx190; X86-AVX-NEXT: retl191;192; X64-LABEL: test_lrint_i32_f32_strict:193; X64: # %bb.0:194; X64-NEXT: pushq %rax195; X64-NEXT: callq lrintf@PLT196; X64-NEXT: popq %rcx197; X64-NEXT: retq198 %conv = tail call i32 @llvm.experimental.constrained.lrint.i32.f32(float %x, metadata!"round.dynamic", metadata!"fpexcept.strict")199 ret i32 %conv200}201 202define i32 @test_lrint_i32_f64_strict(double %x) nounwind strictfp {203; X86-NOSSE-LABEL: test_lrint_i32_f64_strict:204; X86-NOSSE: # %bb.0:205; X86-NOSSE-NEXT: subl $8, %esp206; X86-NOSSE-NEXT: fldl {{[0-9]+}}(%esp)207; X86-NOSSE-NEXT: fstpl (%esp)208; X86-NOSSE-NEXT: wait209; X86-NOSSE-NEXT: calll lrint210; X86-NOSSE-NEXT: addl $8, %esp211; X86-NOSSE-NEXT: retl212;213; X86-SSE2-LABEL: test_lrint_i32_f64_strict:214; X86-SSE2: # %bb.0:215; X86-SSE2-NEXT: subl $8, %esp216; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero217; X86-SSE2-NEXT: movsd %xmm0, (%esp)218; X86-SSE2-NEXT: calll lrint219; X86-SSE2-NEXT: addl $8, %esp220; X86-SSE2-NEXT: retl221;222; X86-AVX-LABEL: test_lrint_i32_f64_strict:223; X86-AVX: # %bb.0:224; X86-AVX-NEXT: subl $8, %esp225; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero226; X86-AVX-NEXT: vmovsd %xmm0, (%esp)227; X86-AVX-NEXT: calll lrint228; X86-AVX-NEXT: addl $8, %esp229; X86-AVX-NEXT: retl230;231; X64-LABEL: test_lrint_i32_f64_strict:232; X64: # %bb.0:233; X64-NEXT: pushq %rax234; X64-NEXT: callq lrint@PLT235; X64-NEXT: popq %rcx236; X64-NEXT: retq237 %conv = tail call i32 @llvm.experimental.constrained.lrint.i32.f64(double %x, metadata!"round.dynamic", metadata!"fpexcept.strict")238 ret i32 %conv239}240 241define i32 @test_lrint_i32_f80_strict(x86_fp80 %x) nounwind strictfp {242; X86-LABEL: test_lrint_i32_f80_strict:243; X86: # %bb.0:244; X86-NEXT: subl $12, %esp245; X86-NEXT: fldt {{[0-9]+}}(%esp)246; X86-NEXT: fstpt (%esp)247; X86-NEXT: wait248; X86-NEXT: calll lrintl249; X86-NEXT: addl $12, %esp250; X86-NEXT: retl251;252; X64-LABEL: test_lrint_i32_f80_strict:253; X64: # %bb.0:254; X64-NEXT: subq $24, %rsp255; X64-NEXT: fldt {{[0-9]+}}(%rsp)256; X64-NEXT: fstpt (%rsp)257; X64-NEXT: wait258; X64-NEXT: callq lrintl@PLT259; X64-NEXT: addq $24, %rsp260; X64-NEXT: retq261 %conv = tail call i32 @llvm.experimental.constrained.lrint.i32.f80(x86_fp80 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")262 ret i32 %conv263}264 265; FIXME(#44744): incorrect libcall266define i32 @test_lrint_i32_f128_strict(fp128 %x) nounwind strictfp {267; X86-NOSSE-LABEL: test_lrint_i32_f128_strict:268; X86-NOSSE: # %bb.0:269; X86-NOSSE-NEXT: pushl %ebp270; X86-NOSSE-NEXT: movl %esp, %ebp271; X86-NOSSE-NEXT: andl $-16, %esp272; X86-NOSSE-NEXT: subl $16, %esp273; X86-NOSSE-NEXT: pushl 20(%ebp)274; X86-NOSSE-NEXT: pushl 16(%ebp)275; X86-NOSSE-NEXT: pushl 12(%ebp)276; X86-NOSSE-NEXT: pushl 8(%ebp)277; X86-NOSSE-NEXT: calll lrintl278; X86-NOSSE-NEXT: addl $16, %esp279; X86-NOSSE-NEXT: movl %ebp, %esp280; X86-NOSSE-NEXT: popl %ebp281; X86-NOSSE-NEXT: retl282;283; X86-SSE2-LABEL: test_lrint_i32_f128_strict:284; X86-SSE2: # %bb.0:285; X86-SSE2-NEXT: pushl %ebp286; X86-SSE2-NEXT: movl %esp, %ebp287; X86-SSE2-NEXT: andl $-16, %esp288; X86-SSE2-NEXT: subl $16, %esp289; X86-SSE2-NEXT: pushl 20(%ebp)290; X86-SSE2-NEXT: pushl 16(%ebp)291; X86-SSE2-NEXT: pushl 12(%ebp)292; X86-SSE2-NEXT: pushl 8(%ebp)293; X86-SSE2-NEXT: calll lrintl294; X86-SSE2-NEXT: addl $16, %esp295; X86-SSE2-NEXT: movl %ebp, %esp296; X86-SSE2-NEXT: popl %ebp297; X86-SSE2-NEXT: retl298;299; X86-AVX-LABEL: test_lrint_i32_f128_strict:300; X86-AVX: # %bb.0:301; X86-AVX-NEXT: pushl %ebp302; X86-AVX-NEXT: movl %esp, %ebp303; X86-AVX-NEXT: andl $-16, %esp304; X86-AVX-NEXT: subl $32, %esp305; X86-AVX-NEXT: vmovups 8(%ebp), %xmm0306; X86-AVX-NEXT: vmovups %xmm0, (%esp)307; X86-AVX-NEXT: calll lrintl308; X86-AVX-NEXT: movl %ebp, %esp309; X86-AVX-NEXT: popl %ebp310; X86-AVX-NEXT: retl311;312; X64-LABEL: test_lrint_i32_f128_strict:313; X64: # %bb.0:314; X64-NEXT: pushq %rax315; X64-NEXT: callq lrintl@PLT316; X64-NEXT: popq %rcx317; X64-NEXT: retq318 %conv = tail call i32 @llvm.experimental.constrained.lrint.i32.f128(fp128 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")319 ret i32 %conv320}321 322declare i32 @llvm.lrint.i32.f32(float) nounwind readnone323declare i32 @llvm.lrint.i32.f64(double) nounwind readnone324declare i32 @llvm.lrint.i32.f80(x86_fp80) nounwind readnone325