1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-apple-macosx %s -o - | FileCheck %s --check-prefix=CHECK-SOFT 3; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+f16c %s -o - | FileCheck %s --check-prefix=CHECK-F16C 4 5define void @extendhfxf(ptr %outptr, ptr %inptr) nounwind { 6; CHECK-SOFT-LABEL: extendhfxf: 7; CHECK-SOFT: ## %bb.0: 8; CHECK-SOFT-NEXT: pushq %rbx 9; CHECK-SOFT-NEXT: subq $16, %rsp 10; CHECK-SOFT-NEXT: movq %rdi, %rbx 11; CHECK-SOFT-NEXT: movzwl (%rsi), %edi 12; CHECK-SOFT-NEXT: callq ___extendhfsf2 13; 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, %rsp 17; CHECK-SOFT-NEXT: popq %rbx 18; CHECK-SOFT-NEXT: retq 19; 20; CHECK-F16C-LABEL: extendhfxf: 21; CHECK-F16C: ## %bb.0: 22; CHECK-F16C-NEXT: vpinsrw $0, (%rsi), %xmm0, %xmm0 23; CHECK-F16C-NEXT: vcvtph2ps %xmm0, %xmm0 24; 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: retq 28 %in = load half, ptr %inptr 29 %fp80 = fpext half %in to x86_fp80 30 store x86_fp80 %fp80, ptr %outptr 31 ret void 32} 33 34; FIXME: We don't currently provide __truncxfhf2, but we can't lower this as 35; 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 %rbx 43; CHECK-SOFT-NEXT: subq $16, %rsp 44; CHECK-SOFT-NEXT: movq %rdi, %rbx 45; CHECK-SOFT-NEXT: fldt (%rsi) 46; CHECK-SOFT-NEXT: fstpt (%rsp) 47; CHECK-SOFT-NEXT: callq ___truncxfhf2 48; CHECK-SOFT-NEXT: pextrw $0, %xmm0, %eax 49; CHECK-SOFT-NEXT: movw %ax, (%rbx) 50; CHECK-SOFT-NEXT: addq $16, %rsp 51; CHECK-SOFT-NEXT: popq %rbx 52; CHECK-SOFT-NEXT: retq 53; 54; CHECK-F16C-LABEL: truncxfhf: 55; CHECK-F16C: ## %bb.0: 56; CHECK-F16C-NEXT: pushq %rbx 57; CHECK-F16C-NEXT: subq $16, %rsp 58; CHECK-F16C-NEXT: movq %rdi, %rbx 59; CHECK-F16C-NEXT: fldt (%rsi) 60; CHECK-F16C-NEXT: fstpt (%rsp) 61; CHECK-F16C-NEXT: callq ___truncxfhf2 62; CHECK-F16C-NEXT: vpextrw $0, %xmm0, (%rbx) 63; CHECK-F16C-NEXT: addq $16, %rsp 64; CHECK-F16C-NEXT: popq %rbx 65; CHECK-F16C-NEXT: retq 66 %in = load x86_fp80, ptr %inptr 67 %half = fptrunc x86_fp80 %in to half 68 store half %half, ptr %outptr 69 ret void 70} 71