181 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 i32 @test_lround_i32_f16(half %x) nounwind {10; %conv = tail call i32 @llvm.lround.i32.f16(half %x)11; ret i32 %conv12; }13 14define i32 @test_lround_i32_f32(float %x) nounwind {15; X86-LABEL: test_lround_i32_f32:16; X86: # %bb.0:17; X86-NEXT: jmp lroundf # TAILCALL18;19; X64-LABEL: test_lround_i32_f32:20; X64: # %bb.0:21; X64-NEXT: jmp lroundf@PLT # TAILCALL22;23; GISEL-X86-LABEL: test_lround_i32_f32:24; GISEL-X86: # %bb.0:25; GISEL-X86-NEXT: subl $12, %esp26; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax27; GISEL-X86-NEXT: movl %eax, (%esp)28; GISEL-X86-NEXT: calll lroundf29; GISEL-X86-NEXT: addl $12, %esp30; GISEL-X86-NEXT: retl31;32; GISEL-X64-LABEL: test_lround_i32_f32:33; GISEL-X64: # %bb.0:34; GISEL-X64-NEXT: pushq %rax35; GISEL-X64-NEXT: callq lroundf36; GISEL-X64-NEXT: popq %rcx37; GISEL-X64-NEXT: retq38 %conv = tail call i32 @llvm.lround.i32.f32(float %x)39 ret i32 %conv40}41 42define i32 @test_lround_i32_f64(double %x) nounwind {43; X86-LABEL: test_lround_i32_f64:44; X86: # %bb.0:45; X86-NEXT: jmp lround # TAILCALL46;47; X64-LABEL: test_lround_i32_f64:48; X64: # %bb.0:49; X64-NEXT: jmp lround@PLT # TAILCALL50;51; GISEL-X86-LABEL: test_lround_i32_f64:52; GISEL-X86: # %bb.0:53; GISEL-X86-NEXT: subl $12, %esp54; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax55; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx56; GISEL-X86-NEXT: movl 4(%eax), %eax57; GISEL-X86-NEXT: xorl %edx, %edx58; GISEL-X86-NEXT: addl %esp, %edx59; GISEL-X86-NEXT: movl %ecx, (%esp)60; GISEL-X86-NEXT: movl %eax, 4(%edx)61; GISEL-X86-NEXT: calll lround62; GISEL-X86-NEXT: addl $12, %esp63; GISEL-X86-NEXT: retl64;65; GISEL-X64-LABEL: test_lround_i32_f64:66; GISEL-X64: # %bb.0:67; GISEL-X64-NEXT: pushq %rax68; GISEL-X64-NEXT: callq lround69; GISEL-X64-NEXT: popq %rcx70; GISEL-X64-NEXT: retq71 %conv = tail call i32 @llvm.lround.i32.f64(double %x)72 ret i32 %conv73}74 75define i32 @test_lround_i32_f80(x86_fp80 %x) nounwind {76; X86-LABEL: test_lround_i32_f80:77; X86: # %bb.0:78; X86-NEXT: jmp lroundl # TAILCALL79;80; X64-LABEL: test_lround_i32_f80:81; X64: # %bb.0:82; X64-NEXT: jmp lroundl@PLT # TAILCALL83;84; GISEL-X86-LABEL: test_lround_i32_f80:85; GISEL-X86: # %bb.0:86; GISEL-X86-NEXT: subl $12, %esp87; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)88; GISEL-X86-NEXT: fstpt (%esp)89; GISEL-X86-NEXT: calll lroundl90; GISEL-X86-NEXT: addl $12, %esp91; GISEL-X86-NEXT: retl92;93; GISEL-X64-LABEL: test_lround_i32_f80:94; GISEL-X64: # %bb.0:95; GISEL-X64-NEXT: subq $24, %rsp96; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)97; GISEL-X64-NEXT: fstpt (%rsp)98; GISEL-X64-NEXT: callq lroundl99; GISEL-X64-NEXT: addq $24, %rsp100; GISEL-X64-NEXT: retq101 %conv = tail call i32 @llvm.lround.i32.f80(x86_fp80 %x)102 ret i32 %conv103}104 105define i32 @test_lround_i32_f128(fp128 %x) nounwind {106; X86-LABEL: test_lround_i32_f128:107; X86: # %bb.0:108; X86-NEXT: pushl %ebp109; X86-NEXT: movl %esp, %ebp110; X86-NEXT: andl $-16, %esp111; X86-NEXT: subl $16, %esp112; X86-NEXT: pushl 20(%ebp)113; X86-NEXT: pushl 16(%ebp)114; X86-NEXT: pushl 12(%ebp)115; X86-NEXT: pushl 8(%ebp)116; X86-NEXT: calll lroundl117; X86-NEXT: addl $16, %esp118; X86-NEXT: movl %ebp, %esp119; X86-NEXT: popl %ebp120; X86-NEXT: retl121;122; X64-LABEL: test_lround_i32_f128:123; X64: # %bb.0:124; X64-NEXT: jmp lroundl@PLT # TAILCALL125;126; GISEL-X86-LABEL: test_lround_i32_f128:127; GISEL-X86: # %bb.0:128; GISEL-X86-NEXT: pushl %esi129; GISEL-X86-NEXT: subl $24, %esp130; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax131; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx132; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx133; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi134; GISEL-X86-NEXT: movl %eax, (%esp)135; GISEL-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)136; GISEL-X86-NEXT: movl %edx, {{[0-9]+}}(%esp)137; GISEL-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)138; GISEL-X86-NEXT: calll lroundf128139; GISEL-X86-NEXT: addl $24, %esp140; GISEL-X86-NEXT: popl %esi141; GISEL-X86-NEXT: retl142;143; GISEL-X64-LABEL: test_lround_i32_f128:144; GISEL-X64: # %bb.0:145; GISEL-X64-NEXT: pushq %rax146; GISEL-X64-NEXT: callq lroundf128147; GISEL-X64-NEXT: popq %rcx148; GISEL-X64-NEXT: retq149 %conv = tail call i32 @llvm.lround.i32.f128(fp128 %x)150 ret i32 %conv151}152 153; FIXME: not yet implemented in global isel154; define i32 @test_lround_i32_f16_strict(half %x) nounwind strictfp {155; %conv = tail call i32 @llvm.experimental.constrained.lround.i32.f16(half %x, metadata!"round.dynamic", metadata!"fpexcept.strict")156; ret i32 %conv157; }158 159; define i32 @test_lround_i32_f32_strict(float %x) nounwind strictfp {160; %conv = tail call i32 @llvm.experimental.constrained.lround.i32.f32(float %x, metadata!"round.dynamic", metadata!"fpexcept.strict")161; ret i32 %conv162; }163 164; define i32 @test_lround_i32_f64_strict(double %x) nounwind strictfp {165; %conv = tail call i32 @llvm.experimental.constrained.lround.i32.f64(double %x, metadata!"round.dynamic", metadata!"fpexcept.strict")166; ret i32 %conv167; }168 169; define i32 @test_lround_i32_f80_strict(x86_fp80 %x) nounwind strictfp {170; %conv = tail call i32 @llvm.experimental.constrained.lround.i32.f80(x86_fp80 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")171; ret i32 %conv172; }173 174; define i32 @test_lround_i32_f128_strict(fp128 %x) nounwind strictfp {175; %conv = tail call i32 @llvm.experimental.constrained.lround.i32.f128(fp128 %x, metadata!"round.dynamic", metadata!"fpexcept.strict")176; ret i32 %conv177; }178;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:179; X86-NOSSE: {{.*}}180; X86-SSE2: {{.*}}181