brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.0 KiB · 85a4339 Raw
288 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2  -O3 | FileCheck %s --check-prefixes=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+f16c  -O3 | FileCheck %s --check-prefixes=AVX4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f  -O3 | FileCheck %s --check-prefixes=AVX5; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512fp16 -O3 | FileCheck %s --check-prefixes=X866; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512fp16 -O3 | FileCheck %s --check-prefixes=X647 8declare half @llvm.experimental.constrained.ceil.f16(half, metadata)9declare half @llvm.experimental.constrained.floor.f16(half, metadata)10declare half @llvm.experimental.constrained.trunc.f16(half, metadata)11declare half @llvm.experimental.constrained.rint.f16(half, metadata, metadata)12declare half @llvm.experimental.constrained.nearbyint.f16(half, metadata, metadata)13declare half @llvm.experimental.constrained.roundeven.f16(half, metadata)14declare half @llvm.experimental.constrained.round.f16(half, metadata)15 16define half @fceil32(half %f) #0 {17; SSE2-LABEL: fceil32:18; SSE2:       # %bb.0:19; SSE2-NEXT:    pushq %rax20; SSE2-NEXT:    callq __extendhfsf2@PLT21; SSE2-NEXT:    callq ceilf@PLT22; SSE2-NEXT:    callq __truncsfhf2@PLT23; SSE2-NEXT:    popq %rax24; SSE2-NEXT:    retq25;26; AVX-LABEL: fceil32:27; AVX:       # %bb.0:28; AVX-NEXT:    vpextrw $0, %xmm0, %eax29; AVX-NEXT:    movzwl %ax, %eax30; AVX-NEXT:    vmovd %eax, %xmm031; AVX-NEXT:    vcvtph2ps %xmm0, %xmm032; AVX-NEXT:    vroundss $10, %xmm0, %xmm0, %xmm033; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm134; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]35; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm036; AVX-NEXT:    retq37;38; X86-LABEL: fceil32:39; X86:       # %bb.0:40; X86-NEXT:    vrndscalesh $10, {{[0-9]+}}(%esp), %xmm7, %xmm041; X86-NEXT:    retl42;43; X64-LABEL: fceil32:44; X64:       # %bb.0:45; X64-NEXT:    vrndscalesh $10, %xmm0, %xmm0, %xmm046; X64-NEXT:    retq47  %res = call half @llvm.experimental.constrained.ceil.f16(48                        half %f, metadata !"fpexcept.strict") #049  ret half %res50}51 52define half @ffloor32(half %f) #0 {53; SSE2-LABEL: ffloor32:54; SSE2:       # %bb.0:55; SSE2-NEXT:    pushq %rax56; SSE2-NEXT:    callq __extendhfsf2@PLT57; SSE2-NEXT:    callq floorf@PLT58; SSE2-NEXT:    callq __truncsfhf2@PLT59; SSE2-NEXT:    popq %rax60; SSE2-NEXT:    retq61;62; AVX-LABEL: ffloor32:63; AVX:       # %bb.0:64; AVX-NEXT:    vpextrw $0, %xmm0, %eax65; AVX-NEXT:    movzwl %ax, %eax66; AVX-NEXT:    vmovd %eax, %xmm067; AVX-NEXT:    vcvtph2ps %xmm0, %xmm068; AVX-NEXT:    vroundss $9, %xmm0, %xmm0, %xmm069; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm170; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]71; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm072; AVX-NEXT:    retq73;74; X86-LABEL: ffloor32:75; X86:       # %bb.0:76; X86-NEXT:    vrndscalesh $9, {{[0-9]+}}(%esp), %xmm7, %xmm077; X86-NEXT:    retl78;79; X64-LABEL: ffloor32:80; X64:       # %bb.0:81; X64-NEXT:    vrndscalesh $9, %xmm0, %xmm0, %xmm082; X64-NEXT:    retq83  %res = call half @llvm.experimental.constrained.floor.f16(84                        half %f, metadata !"fpexcept.strict") #085  ret half %res86}87 88define half @ftrunc32(half %f) #0 {89; SSE2-LABEL: ftrunc32:90; SSE2:       # %bb.0:91; SSE2-NEXT:    pushq %rax92; SSE2-NEXT:    callq __extendhfsf2@PLT93; SSE2-NEXT:    callq truncf@PLT94; SSE2-NEXT:    callq __truncsfhf2@PLT95; SSE2-NEXT:    popq %rax96; SSE2-NEXT:    retq97;98; AVX-LABEL: ftrunc32:99; AVX:       # %bb.0:100; AVX-NEXT:    vpextrw $0, %xmm0, %eax101; AVX-NEXT:    movzwl %ax, %eax102; AVX-NEXT:    vmovd %eax, %xmm0103; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0104; AVX-NEXT:    vroundss $11, %xmm0, %xmm0, %xmm0105; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1106; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]107; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0108; AVX-NEXT:    retq109;110; X86-LABEL: ftrunc32:111; X86:       # %bb.0:112; X86-NEXT:    vrndscalesh $11, {{[0-9]+}}(%esp), %xmm7, %xmm0113; X86-NEXT:    retl114;115; X64-LABEL: ftrunc32:116; X64:       # %bb.0:117; X64-NEXT:    vrndscalesh $11, %xmm0, %xmm0, %xmm0118; X64-NEXT:    retq119  %res = call half @llvm.experimental.constrained.trunc.f16(120                        half %f, metadata !"fpexcept.strict") #0121  ret half %res122}123 124define half @frint32(half %f) #0 {125; SSE2-LABEL: frint32:126; SSE2:       # %bb.0:127; SSE2-NEXT:    pushq %rax128; SSE2-NEXT:    callq __extendhfsf2@PLT129; SSE2-NEXT:    callq rintf@PLT130; SSE2-NEXT:    callq __truncsfhf2@PLT131; SSE2-NEXT:    popq %rax132; SSE2-NEXT:    retq133;134; AVX-LABEL: frint32:135; AVX:       # %bb.0:136; AVX-NEXT:    vpextrw $0, %xmm0, %eax137; AVX-NEXT:    movzwl %ax, %eax138; AVX-NEXT:    vmovd %eax, %xmm0139; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0140; AVX-NEXT:    vroundss $4, %xmm0, %xmm0, %xmm0141; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1142; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]143; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0144; AVX-NEXT:    retq145;146; X86-LABEL: frint32:147; X86:       # %bb.0:148; X86-NEXT:    vrndscalesh $4, {{[0-9]+}}(%esp), %xmm7, %xmm0149; X86-NEXT:    retl150;151; X64-LABEL: frint32:152; X64:       # %bb.0:153; X64-NEXT:    vrndscalesh $4, %xmm0, %xmm0, %xmm0154; X64-NEXT:    retq155  %res = call half @llvm.experimental.constrained.rint.f16(156                        half %f,157                        metadata !"round.dynamic", metadata !"fpexcept.strict") #0158  ret half %res159}160 161define half @fnearbyint32(half %f) #0 {162; SSE2-LABEL: fnearbyint32:163; SSE2:       # %bb.0:164; SSE2-NEXT:    pushq %rax165; SSE2-NEXT:    callq __extendhfsf2@PLT166; SSE2-NEXT:    callq nearbyintf@PLT167; SSE2-NEXT:    callq __truncsfhf2@PLT168; SSE2-NEXT:    popq %rax169; SSE2-NEXT:    retq170;171; AVX-LABEL: fnearbyint32:172; AVX:       # %bb.0:173; AVX-NEXT:    vpextrw $0, %xmm0, %eax174; AVX-NEXT:    movzwl %ax, %eax175; AVX-NEXT:    vmovd %eax, %xmm0176; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0177; AVX-NEXT:    vroundss $12, %xmm0, %xmm0, %xmm0178; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1179; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]180; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0181; AVX-NEXT:    retq182;183; X86-LABEL: fnearbyint32:184; X86:       # %bb.0:185; X86-NEXT:    vrndscalesh $12, {{[0-9]+}}(%esp), %xmm7, %xmm0186; X86-NEXT:    retl187;188; X64-LABEL: fnearbyint32:189; X64:       # %bb.0:190; X64-NEXT:    vrndscalesh $12, %xmm0, %xmm0, %xmm0191; X64-NEXT:    retq192  %res = call half @llvm.experimental.constrained.nearbyint.f16(193                        half %f,194                        metadata !"round.dynamic", metadata !"fpexcept.strict") #0195  ret half %res196}197 198define half @froundeven16(half %f) #0 {199; SSE2-LABEL: froundeven16:200; SSE2:       # %bb.0:201; SSE2-NEXT:    pushq %rax202; SSE2-NEXT:    callq __extendhfsf2@PLT203; SSE2-NEXT:    callq roundevenf@PLT204; SSE2-NEXT:    callq __truncsfhf2@PLT205; SSE2-NEXT:    popq %rax206; SSE2-NEXT:    retq207;208; AVX-LABEL: froundeven16:209; AVX:       # %bb.0:210; AVX-NEXT:    vpextrw $0, %xmm0, %eax211; AVX-NEXT:    movzwl %ax, %eax212; AVX-NEXT:    vmovd %eax, %xmm0213; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0214; AVX-NEXT:    vroundss $8, %xmm0, %xmm0, %xmm0215; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1216; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]217; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0218; AVX-NEXT:    retq219;220; X86-LABEL: froundeven16:221; X86:       # %bb.0:222; X86-NEXT:    vrndscalesh $8, {{[0-9]+}}(%esp), %xmm7, %xmm0223; X86-NEXT:    retl224;225; X64-LABEL: froundeven16:226; X64:       # %bb.0:227; X64-NEXT:    vrndscalesh $8, %xmm0, %xmm0, %xmm0228; X64-NEXT:    retq229 230  %res = call half @llvm.experimental.constrained.roundeven.f16(231                        half %f, metadata !"fpexcept.strict") #0232  ret half %res233}234 235define half @fround16(half %f) #0 {236; SSE2-LABEL: fround16:237; SSE2:       # %bb.0:238; SSE2-NEXT:    pushq %rax239; SSE2-NEXT:    callq __extendhfsf2@PLT240; SSE2-NEXT:    callq roundf@PLT241; SSE2-NEXT:    callq __truncsfhf2@PLT242; SSE2-NEXT:    popq %rax243; SSE2-NEXT:    retq244;245; AVX-LABEL: fround16:246; AVX:       # %bb.0:247; AVX-NEXT:    pushq %rax248; AVX-NEXT:    vpextrw $0, %xmm0, %eax249; AVX-NEXT:    movzwl %ax, %eax250; AVX-NEXT:    vmovd %eax, %xmm0251; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0252; AVX-NEXT:    callq roundf@PLT253; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1254; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]255; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0256; AVX-NEXT:    popq %rax257; AVX-NEXT:    retq258;259; X86-LABEL: fround16:260; X86:       # %bb.0:261; X86-NEXT:    subl $8, %esp262; X86-NEXT:    vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero263; X86-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0264; X86-NEXT:    vmovss %xmm0, (%esp)265; X86-NEXT:    calll roundf266; X86-NEXT:    fstps {{[0-9]+}}(%esp)267; X86-NEXT:    wait268; X86-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero269; X86-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0270; X86-NEXT:    addl $8, %esp271; X86-NEXT:    retl272;273; X64-LABEL: fround16:274; X64:       # %bb.0:275; X64-NEXT:    pushq %rax276; X64-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0277; X64-NEXT:    callq roundf@PLT278; X64-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0279; X64-NEXT:    popq %rax280; X64-NEXT:    retq281 282  %res = call half @llvm.experimental.constrained.round.f16(283                        half %f, metadata !"fpexcept.strict") #0284  ret half %res285}286 287attributes #0 = { strictfp nounwind }288