Preserve SNAN literals on i386.

// The i386 calling convention does not preserve 32-bit SNAN constants on
// return. The SYSTEM V ABI for i386 says that float values must be returned in
// %st(0) as 80-bit extended precision doubles. On x86 architectures converting
// a SNAN from floating point type to another replaces the SNAN with the
// corresponding QNAN. For example the float 0fff800001 will be transformed into
// 0fffc00001. To avoid loss of information, we wrap all floats in a
// structure. The i386 calling convention says that structures will be returned
// in memory regardless of their contents. The wrapping has no performance
// impact on x86-64, since the structure will be returned in the xmm0 register
// exactly as though it were a naked float.
//
// Here is a simple hsail program demonstrating the problem:
//
// version 0:96:$full:$small;
// global_f32 &n = 0fff800001;
// kernel &__OpenCL_Global_Initializer_kernel(
//         kernarg_u32 %r)
// {
// @__OpenCL_Global_Initializer_kernel_entry:
//         ld_kernarg_u32 $s2, [%r];
//         ld_global_u32  $s1, [&n];
//         st_global_u32  $s1, [$s2];
//         ret;
// };