brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.3 KiB · 2b99b4c Raw
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