cranelift: add i64.{ishl,ushr,ashr} libcalls.

These libcalls are useful for 32-bit platforms.

On x86_32 in particular, commit 4ec16fa0 added support for legalizing
64-bit shifts through SIMD operations. However, that legalization
requires SIMD to be enabled and SSE 4.1 to be supported, which is not
acceptable as a hard requirement.
This commit is contained in:
whitequark
2020-05-29 15:53:52 +00:00
committed by Andrew Brown
parent be20c92205
commit bc555468a7
7 changed files with 99 additions and 9 deletions

View File

@@ -29,3 +29,39 @@ block0(v0: i64, v1: i64):
v2 = urem v0, v1
return v2
}
function %i64_i32_shl(i64, i32) -> i64 {
block0(v0: i64, v1: i32):
v2 = ishl v0, v1
return v2
}
function %i64_i32_shr_u(i64, i32) -> i64 {
block0(v0: i64, v1: i32):
v2 = ushr v0, v1
return v2
}
function %i64_i32_shr_s(i64, i32) -> i64 {
block0(v0: i64, v1: i32):
v2 = sshr v0, v1
return v2
}
function %i64_i64_shl(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = ishl v0, v1
return v2
}
function %i64_i64_shr_u(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = ushr v0, v1
return v2
}
function %i64_i64_shr_s(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = sshr v0, v1
return v2
}