392 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=x86_64-unknown | FileCheck %s --check-prefixes=X645; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X866; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X647 8; FIXME: crash9; define i64 @test_llround_f16(half %x) nounwind {10; %conv = tail call i64 @llvm.llround.f16(half %x)11; ret i64 %conv12; }13 14define i64 @test_llround_f32(float %x) nounwind {15; X86-NOSSE-LABEL: test_llround_f32:16; X86-NOSSE: # %bb.0:17; X86-NOSSE-NEXT: pushl %eax18; X86-NOSSE-NEXT: flds {{[0-9]+}}(%esp)19; X86-NOSSE-NEXT: fstps (%esp)20; X86-NOSSE-NEXT: calll llroundf21; X86-NOSSE-NEXT: popl %ecx22; X86-NOSSE-NEXT: retl23;24; X86-SSE2-LABEL: test_llround_f32:25; X86-SSE2: # %bb.0:26; X86-SSE2-NEXT: pushl %eax27; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero28; X86-SSE2-NEXT: movss %xmm0, (%esp)29; X86-SSE2-NEXT: calll llroundf30; X86-SSE2-NEXT: popl %ecx31; X86-SSE2-NEXT: retl32;33; X64-LABEL: test_llround_f32:34; X64: # %bb.0:35; X64-NEXT: jmp llroundf@PLT # TAILCALL36;37; GISEL-X86-LABEL: test_llround_f32:38; GISEL-X86: # %bb.0:39; GISEL-X86-NEXT: subl $12, %esp40; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax41; GISEL-X86-NEXT: movl %eax, (%esp)42; GISEL-X86-NEXT: calll llroundf43; GISEL-X86-NEXT: addl $12, %esp44; GISEL-X86-NEXT: retl45;46; GISEL-X64-LABEL: test_llround_f32:47; GISEL-X64: # %bb.0:48; GISEL-X64-NEXT: pushq %rax49; GISEL-X64-NEXT: callq llroundf50; GISEL-X64-NEXT: popq %rcx51; GISEL-X64-NEXT: retq52 %conv = tail call i64 @llvm.llround.f32(float %x)53 ret i64 %conv54}55 56define i64 @test_llround_f64(double %x) nounwind {57; X86-NOSSE-LABEL: test_llround_f64:58; X86-NOSSE: # %bb.0:59; X86-NOSSE-NEXT: subl $8, %esp60; X86-NOSSE-NEXT: fldl {{[0-9]+}}(%esp)61; X86-NOSSE-NEXT: fstpl (%esp)62; X86-NOSSE-NEXT: calll llround63; X86-NOSSE-NEXT: addl $8, %esp64; X86-NOSSE-NEXT: retl65;66; X86-SSE2-LABEL: test_llround_f64:67; X86-SSE2: # %bb.0:68; X86-SSE2-NEXT: subl $8, %esp69; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero70; X86-SSE2-NEXT: movsd %xmm0, (%esp)71; X86-SSE2-NEXT: calll llround72; X86-SSE2-NEXT: addl $8, %esp73; X86-SSE2-NEXT: retl74;75; X64-LABEL: test_llround_f64:76; X64: # %bb.0:77; X64-NEXT: jmp llround@PLT # TAILCALL78;79; GISEL-X86-LABEL: test_llround_f64:80; GISEL-X86: # %bb.0:81; GISEL-X86-NEXT: subl $12, %esp82; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax83; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx84; GISEL-X86-NEXT: movl 4(%eax), %eax85; GISEL-X86-NEXT: xorl %edx, %edx86; GISEL-X86-NEXT: addl %esp, %edx87; GISEL-X86-NEXT: movl %ecx, (%esp)88; GISEL-X86-NEXT: movl %eax, 4(%edx)89; GISEL-X86-NEXT: calll llround90; GISEL-X86-NEXT: addl $12, %esp91; GISEL-X86-NEXT: retl92;93; GISEL-X64-LABEL: test_llround_f64:94; GISEL-X64: # %bb.0:95; GISEL-X64-NEXT: pushq %rax96; GISEL-X64-NEXT: callq llround97; GISEL-X64-NEXT: popq %rcx98; GISEL-X64-NEXT: retq99 %conv = tail call i64 @llvm.llround.f64(double %x)100 ret i64 %conv101}102 103define i64 @test_llround_f80(x86_fp80 %x) nounwind {104; X86-LABEL: test_llround_f80:105; X86: # %bb.0:106; X86-NEXT: subl $12, %esp107; X86-NEXT: fldt {{[0-9]+}}(%esp)108; X86-NEXT: fstpt (%esp)109; X86-NEXT: calll llroundl110; X86-NEXT: addl $12, %esp111; X86-NEXT: retl112;113; X64-LABEL: test_llround_f80:114; X64: # %bb.0:115; X64-NEXT: jmp llroundl@PLT # TAILCALL116;117; GISEL-X86-LABEL: test_llround_f80:118; GISEL-X86: # %bb.0:119; GISEL-X86-NEXT: subl $12, %esp120; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)121; GISEL-X86-NEXT: fstpt (%esp)122; GISEL-X86-NEXT: calll llroundl123; GISEL-X86-NEXT: addl $12, %esp124; GISEL-X86-NEXT: retl125;126; GISEL-X64-LABEL: test_llround_f80:127; GISEL-X64: # %bb.0:128; GISEL-X64-NEXT: subq $24, %rsp129; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)130; GISEL-X64-NEXT: fstpt (%rsp)131; GISEL-X64-NEXT: callq llroundl132; GISEL-X64-NEXT: addq $24, %rsp133; GISEL-X64-NEXT: retq134 %conv = tail call i64 @llvm.llround.f80(x86_fp80 %x)135 ret i64 %conv136}137 138; FIXME(#44744): incorrect libcall139define i64 @test_llround_f128(fp128 %x) nounwind {140; X86-LABEL: test_llround_f128:141; X86: # %bb.0:142; X86-NEXT: pushl %ebp143; X86-NEXT: movl %esp, %ebp144; X86-NEXT: andl $-16, %esp145; X86-NEXT: subl $16, %esp146; X86-NEXT: pushl 20(%ebp)147; X86-NEXT: pushl 16(%ebp)148; X86-NEXT: pushl 12(%ebp)149; X86-NEXT: pushl 8(%ebp)150; X86-NEXT: calll llroundl151; X86-NEXT: addl $16, %esp152; X86-NEXT: movl %ebp, %esp153; X86-NEXT: popl %ebp154; X86-NEXT: retl155;156; X64-LABEL: test_llround_f128:157; X64: # %bb.0:158; X64-NEXT: jmp llroundl@PLT # TAILCALL159;160; GISEL-X86-LABEL: test_llround_f128:161; GISEL-X86: # %bb.0:162; GISEL-X86-NEXT: pushl %esi163; GISEL-X86-NEXT: subl $24, %esp164; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax165; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx166; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx167; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi168; GISEL-X86-NEXT: movl %eax, (%esp)169; GISEL-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)170; GISEL-X86-NEXT: movl %edx, {{[0-9]+}}(%esp)171; GISEL-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)172; GISEL-X86-NEXT: calll llroundf128173; GISEL-X86-NEXT: addl $24, %esp174; GISEL-X86-NEXT: popl %esi175; GISEL-X86-NEXT: retl176;177; GISEL-X64-LABEL: test_llround_f128:178; GISEL-X64: # %bb.0:179; GISEL-X64-NEXT: pushq %rax180; GISEL-X64-NEXT: callq llroundf128181; GISEL-X64-NEXT: popq %rcx182; GISEL-X64-NEXT: retq183 %conv = tail call i64 @llvm.llround.f128(fp128 %x)184 ret i64 %conv185}186 187; FIXME: crash188; define i64 @test_llround_i64_f16(half %x) nounwind {189; %conv = call i64 @llvm.llround.i64.f16(half %x)190; ret i64 %conv191; }192 193define i64 @test_llround_i64_f32(float %x) nounwind {194; X86-NOSSE-LABEL: test_llround_i64_f32:195; X86-NOSSE: # %bb.0:196; X86-NOSSE-NEXT: pushl %eax197; X86-NOSSE-NEXT: flds {{[0-9]+}}(%esp)198; X86-NOSSE-NEXT: fstps (%esp)199; X86-NOSSE-NEXT: calll llroundf200; X86-NOSSE-NEXT: popl %ecx201; X86-NOSSE-NEXT: retl202;203; X86-SSE2-LABEL: test_llround_i64_f32:204; X86-SSE2: # %bb.0:205; X86-SSE2-NEXT: pushl %eax206; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero207; X86-SSE2-NEXT: movss %xmm0, (%esp)208; X86-SSE2-NEXT: calll llroundf209; X86-SSE2-NEXT: popl %ecx210; X86-SSE2-NEXT: retl211;212; X64-LABEL: test_llround_i64_f32:213; X64: # %bb.0:214; X64-NEXT: jmp llroundf@PLT # TAILCALL215;216; GISEL-X86-LABEL: test_llround_i64_f32:217; GISEL-X86: # %bb.0:218; GISEL-X86-NEXT: subl $12, %esp219; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax220; GISEL-X86-NEXT: movl %eax, (%esp)221; GISEL-X86-NEXT: calll llroundf222; GISEL-X86-NEXT: addl $12, %esp223; GISEL-X86-NEXT: retl224;225; GISEL-X64-LABEL: test_llround_i64_f32:226; GISEL-X64: # %bb.0:227; GISEL-X64-NEXT: pushq %rax228; GISEL-X64-NEXT: callq llroundf229; GISEL-X64-NEXT: popq %rcx230; GISEL-X64-NEXT: retq231 %conv = call i64 @llvm.llround.i64.f32(float %x)232 ret i64 %conv233}234 235define i64 @test_llround_i64_f64(double %x) nounwind {236; X86-NOSSE-LABEL: test_llround_i64_f64:237; X86-NOSSE: # %bb.0:238; X86-NOSSE-NEXT: subl $8, %esp239; X86-NOSSE-NEXT: fldl {{[0-9]+}}(%esp)240; X86-NOSSE-NEXT: fstpl (%esp)241; X86-NOSSE-NEXT: calll llround242; X86-NOSSE-NEXT: addl $8, %esp243; X86-NOSSE-NEXT: retl244;245; X86-SSE2-LABEL: test_llround_i64_f64:246; X86-SSE2: # %bb.0:247; X86-SSE2-NEXT: subl $8, %esp248; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero249; X86-SSE2-NEXT: movsd %xmm0, (%esp)250; X86-SSE2-NEXT: calll llround251; X86-SSE2-NEXT: addl $8, %esp252; X86-SSE2-NEXT: retl253;254; X64-LABEL: test_llround_i64_f64:255; X64: # %bb.0:256; X64-NEXT: jmp llround@PLT # TAILCALL257;258; GISEL-X86-LABEL: test_llround_i64_f64:259; GISEL-X86: # %bb.0:260; GISEL-X86-NEXT: subl $12, %esp261; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax262; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx263; GISEL-X86-NEXT: movl 4(%eax), %eax264; GISEL-X86-NEXT: xorl %edx, %edx265; GISEL-X86-NEXT: addl %esp, %edx266; GISEL-X86-NEXT: movl %ecx, (%esp)267; GISEL-X86-NEXT: movl %eax, 4(%edx)268; GISEL-X86-NEXT: calll llround269; GISEL-X86-NEXT: addl $12, %esp270; GISEL-X86-NEXT: retl271;272; GISEL-X64-LABEL: test_llround_i64_f64:273; GISEL-X64: # %bb.0:274; GISEL-X64-NEXT: pushq %rax275; GISEL-X64-NEXT: callq llround276; GISEL-X64-NEXT: popq %rcx277; GISEL-X64-NEXT: retq278 %conv = call i64 @llvm.llround.i64.f64(double %x)279 ret i64 %conv280}281 282define i64 @test_llround_i64_f80(x86_fp80 %x) nounwind {283; X86-LABEL: test_llround_i64_f80:284; X86: # %bb.0:285; X86-NEXT: subl $12, %esp286; X86-NEXT: fldt {{[0-9]+}}(%esp)287; X86-NEXT: fstpt (%esp)288; X86-NEXT: calll llroundl289; X86-NEXT: addl $12, %esp290; X86-NEXT: retl291;292; X64-LABEL: test_llround_i64_f80:293; X64: # %bb.0:294; X64-NEXT: jmp llroundl@PLT # TAILCALL295;296; GISEL-X86-LABEL: test_llround_i64_f80:297; GISEL-X86: # %bb.0:298; GISEL-X86-NEXT: subl $12, %esp299; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)300; GISEL-X86-NEXT: fstpt (%esp)301; GISEL-X86-NEXT: calll llroundl302; GISEL-X86-NEXT: addl $12, %esp303; GISEL-X86-NEXT: retl304;305; GISEL-X64-LABEL: test_llround_i64_f80:306; GISEL-X64: # %bb.0:307; GISEL-X64-NEXT: subq $24, %rsp308; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)309; GISEL-X64-NEXT: fstpt (%rsp)310; GISEL-X64-NEXT: callq llroundl311; GISEL-X64-NEXT: addq $24, %rsp312; GISEL-X64-NEXT: retq313 %conv = call i64 @llvm.llround.i64.f80(x86_fp80 %x)314 ret i64 %conv315}316 317; FIXME(#44744): incorrect libcall318define i64 @test_llround_i64_f128(fp128 %x) nounwind {319; X86-LABEL: test_llround_i64_f128:320; X86: # %bb.0:321; X86-NEXT: pushl %ebp322; X86-NEXT: movl %esp, %ebp323; X86-NEXT: andl $-16, %esp324; X86-NEXT: subl $16, %esp325; X86-NEXT: pushl 20(%ebp)326; X86-NEXT: pushl 16(%ebp)327; X86-NEXT: pushl 12(%ebp)328; X86-NEXT: pushl 8(%ebp)329; X86-NEXT: calll llroundl330; X86-NEXT: addl $16, %esp331; X86-NEXT: movl %ebp, %esp332; X86-NEXT: popl %ebp333; X86-NEXT: retl334;335; X64-LABEL: test_llround_i64_f128:336; X64: # %bb.0:337; X64-NEXT: jmp llroundl@PLT # TAILCALL338;339; GISEL-X86-LABEL: test_llround_i64_f128:340; GISEL-X86: # %bb.0:341; GISEL-X86-NEXT: pushl %esi342; GISEL-X86-NEXT: subl $24, %esp343; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax344; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx345; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx346; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi347; GISEL-X86-NEXT: movl %eax, (%esp)348; GISEL-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)349; GISEL-X86-NEXT: movl %edx, {{[0-9]+}}(%esp)350; GISEL-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)351; GISEL-X86-NEXT: calll llroundf128352; GISEL-X86-NEXT: addl $24, %esp353; GISEL-X86-NEXT: popl %esi354; GISEL-X86-NEXT: retl355;356; GISEL-X64-LABEL: test_llround_i64_f128:357; GISEL-X64: # %bb.0:358; GISEL-X64-NEXT: pushq %rax359; GISEL-X64-NEXT: callq llroundf128360; GISEL-X64-NEXT: popq %rcx361; GISEL-X64-NEXT: retq362 %conv = call i64 @llvm.llround.i64.f128(fp128 %x)363 ret i64 %conv364}365 366; FIXME: not yet implemented for global isel367; define i64 @test_llround_i64_f16_strict(half %x) nounwind strictfp {368; %conv = call i64 @llvm.experimental.constrained.llround.i64.f16(half %x, metadata!"round.dynamic", metadata!"fpexcept.strict")369; ret i64 %conv370; }371 372; define i64 @test_llround_i64_f32_strict(float %x) nounwind strictfp {373; %conv = call i64 @llvm.experimental.constrained.llround.i64.f32(float %x, metadata!"round.dynamic", metadata!"fpexcept.strict")374; ret i64 %conv375; }376 377; define i64 @test_llround_i64_f64_strict(double %x) nounwind strictfp {378; %conv = call i64 @llvm.experimental.constrained.llround.i64.f64(double %x, metadata!"round.dynamic", metadata!"fpexcept.strict")379; ret i64 %conv380; }381 382; define i64 @test_llround_i64_f80_strict(x86_fp80 %x) nounwind strictfp {383; %conv = call i64 @llvm.experimental.constrained.llround.i64.f80(x86_fp80 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")384; ret i64 %conv385; }386 387; ; FIXME(#44744): incorrect libcall388; define i64 @test_llround_i64_f128_strict(fp128 %x) nounwind strictfp {389; %conv = call i64 @llvm.experimental.constrained.llround.i64.f128(fp128 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")390; ret i64 %conv391; }392