With the recently(ish) added support for _Float16, LLVM is now emitting libcalls to convert to and from long double (particularly important for the trunc to avoid double-rounding). Latest GCC already seems to include these in libgcc, but compiler-rt hasn't up to now.
It's a bit messy in the implementation files since x86_fp80 has an explicit digit with the integer part of the significand unlike the other types that have an implicit 1.abcde... except for denormals. I handled this by converting to an imaginary "normal" 80-bit float when needed.
The extend tests were derived from half -> float -> x86_fp80 two-step conversion, the truncate tests didn't need changing from the regular float versions since the _Float16 representation is the same in both cases.