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