This patch makes half and vectors of half valid types for the AArch64 backend (half is known as f16 in the backend). This is mostly a case of adding f16 to all instruction selection patterns that can use it, but also adds some target-independent logic for promoting arithmetic operations to a wider floating-point type, and fixes up some AArch64 custom lowering which assumes that the smallest floating-point type is f32.
The motivation for this is that the ACLE (ARM C Language Extensions) allows fp16 to be used as a function argument or return type, and it must be passed in floating-point registers. Previously, fp16 was converted to i16, so the backend could not know to pass an __fp16 in a different register to a short.
Are these needed? I don't see any code in LegalizeDAG to promote FP_ROUND or FP_EXTEND (and doing so sounds a bit dodgy, given that they're what we'll be using to *do* the promotion in general).