71 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-apple-macosx %s -o - | FileCheck %s --check-prefix=CHECK-SOFT3; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+f16c %s -o - | FileCheck %s --check-prefix=CHECK-F16C4 5define void @extendhfxf(ptr %outptr, ptr %inptr) nounwind {6; CHECK-SOFT-LABEL: extendhfxf:7; CHECK-SOFT: ## %bb.0:8; CHECK-SOFT-NEXT: pushq %rbx9; CHECK-SOFT-NEXT: subq $16, %rsp10; CHECK-SOFT-NEXT: movq %rdi, %rbx11; CHECK-SOFT-NEXT: movzwl (%rsi), %edi12; CHECK-SOFT-NEXT: callq ___extendhfsf213; CHECK-SOFT-NEXT: movss %xmm0, {{[0-9]+}}(%rsp)14; CHECK-SOFT-NEXT: flds {{[0-9]+}}(%rsp)15; CHECK-SOFT-NEXT: fstpt (%rbx)16; CHECK-SOFT-NEXT: addq $16, %rsp17; CHECK-SOFT-NEXT: popq %rbx18; CHECK-SOFT-NEXT: retq19;20; CHECK-F16C-LABEL: extendhfxf:21; CHECK-F16C: ## %bb.0:22; CHECK-F16C-NEXT: vpinsrw $0, (%rsi), %xmm0, %xmm023; CHECK-F16C-NEXT: vcvtph2ps %xmm0, %xmm024; CHECK-F16C-NEXT: vmovss %xmm0, -{{[0-9]+}}(%rsp)25; CHECK-F16C-NEXT: flds -{{[0-9]+}}(%rsp)26; CHECK-F16C-NEXT: fstpt (%rdi)27; CHECK-F16C-NEXT: retq28 %in = load half, ptr %inptr29 %fp80 = fpext half %in to x86_fp8030 store x86_fp80 %fp80, ptr %outptr31 ret void32}33 34; FIXME: We don't currently provide __truncxfhf2, but we can't lower this as35; successive fptruncs (like we do fpext) because of double rounding.36; We also don't currently soft-float this call, like we do e.g., __truncsfhf2:37; the latter long predates the fp16 parameter passing ABI, so can't change.38; If we ever add a __truncxfhf2, we're not bound by existing ABI.39define void @truncxfhf(ptr %outptr, ptr %inptr) nounwind {40; CHECK-SOFT-LABEL: truncxfhf:41; CHECK-SOFT: ## %bb.0:42; CHECK-SOFT-NEXT: pushq %rbx43; CHECK-SOFT-NEXT: subq $16, %rsp44; CHECK-SOFT-NEXT: movq %rdi, %rbx45; CHECK-SOFT-NEXT: fldt (%rsi)46; CHECK-SOFT-NEXT: fstpt (%rsp)47; CHECK-SOFT-NEXT: callq ___truncxfhf248; CHECK-SOFT-NEXT: pextrw $0, %xmm0, %eax49; CHECK-SOFT-NEXT: movw %ax, (%rbx)50; CHECK-SOFT-NEXT: addq $16, %rsp51; CHECK-SOFT-NEXT: popq %rbx52; CHECK-SOFT-NEXT: retq53;54; CHECK-F16C-LABEL: truncxfhf:55; CHECK-F16C: ## %bb.0:56; CHECK-F16C-NEXT: pushq %rbx57; CHECK-F16C-NEXT: subq $16, %rsp58; CHECK-F16C-NEXT: movq %rdi, %rbx59; CHECK-F16C-NEXT: fldt (%rsi)60; CHECK-F16C-NEXT: fstpt (%rsp)61; CHECK-F16C-NEXT: callq ___truncxfhf262; CHECK-F16C-NEXT: vpextrw $0, %xmm0, (%rbx)63; CHECK-F16C-NEXT: addq $16, %rsp64; CHECK-F16C-NEXT: popq %rbx65; CHECK-F16C-NEXT: retq66 %in = load x86_fp80, ptr %inptr67 %half = fptrunc x86_fp80 %in to half68 store half %half, ptr %outptr69 ret void70}71