The test results suggest that what we probably actually want is elementwise_intrinsic_float_convert_args(). The logic for the first two arguments seems consistent with what we see elsewhere, and a quick test confirms that the function does preserve halves.
elementwise_intrinsic_float_convert_args() does, somewhat awkwardly, take a parse_initializer, and we don't actually want to apply that conversion to *every* argument in this case. That shouldn't be insurmountable, though.