This implements OpenCL-style SIMD vectors, that map down to LLVM vectors
of matching type.
This means you can do cool stuff like,
let a = [1.0f32, 2.0f32, 3.0f32, 4.0f32] as f32x4;
let b = a.even + a.odd;
let c = a.s3210;
let mut d = a;
d.even = d.odd;
and other similarly amazing tomfoolery.
This doesn't replace the struct-based SIMD types that Rust currently
supports, but it should. The reason being that you need to be able to
generate anonymous SIMD types.
For example, x.xy is a <2 x T> vector, which may not have been declared,
but we still need to be able to pretty-print it.
d3709e3