Support bitcasting between scalar and vector types
Feature
See title. For example v0 = vconst.i64x2 ...; bitcast.i128 little v0.
Benefit
This allows bitcasting between the two without having to go through memory. Cg_clif needs this bitcasting for implementing mem::transmute and float to 128bit int casts on Windows. Currently it has to go through the stack, which is slower and inhibits optimizations.
This seems like a good starter issue. It currently affects all of our 4 backends.
Here's a test demonstrating the issue:
test compile
target aarch64
function %bitcast_vec_to_int(i64x2) -> i128 {
block0(v0: i64x2):
v1 = bitcast.i128 little v0
return v1
}
function %bitcast_int_to_vec(i128) -> i64x2 {
block0(v0: i128):
v1 = bitcast.i64x2 little v0
return v1
}
When running this test it fails with: should be implemented in ISLE: inst = v1 = bitcast.i128 little v0, type = Some(types::I128)
Happy to help anyone who wants to try working on this!
@afonso360 It seems like the only remaining part to fix is s390x, right?
Yes, I think that's correct
Yes, I think that's correct
I'll take a look at how to get a VM running on my ARM MacBook.
Maybe I can take on that remaining part.
Signed up for (access/time on) one of those LinuxONE servers from IBM, but no response from them so far lol. I dunno whether maybe QEMU is the preferred approach?
QEMU is usually easier for working on different arches. We have a great doc on how to set it up if you're running in Linux
QEMU is usually easier for working on different arches. We have a great doc on how to set it up if you're running in Linux
Maybe I'll try to run those in a VM. Unfortunately I'm a Mac person for the time being.