Use unsigned LLVM intrinsic arithmetic for unsigned integers

Closes #2331
This commit is contained in:
ayazhafiz 2022-01-10 18:58:48 -05:00
parent 2f3919c870
commit abe42781d5
3 changed files with 86 additions and 25 deletions

View file

@ -201,24 +201,28 @@ macro_rules! float_intrinsic {
#[macro_export]
macro_rules! int_intrinsic {
($name:literal) => {{
($signed_name:literal, $unsigned_name:literal) => {{
let mut output = IntrinsicName::default();
// These are LLVM types which don't include
// u64 for example
output.options[4] = concat!($name, ".i8");
output.options[5] = concat!($name, ".i16");
output.options[6] = concat!($name, ".i32");
output.options[7] = concat!($name, ".i64");
output.options[8] = concat!($name, ".i128");
output.options[9] = concat!($name, ".i8");
output.options[10] = concat!($name, ".i16");
output.options[11] = concat!($name, ".i32");
output.options[12] = concat!($name, ".i64");
output.options[13] = concat!($name, ".i128");
// The indeces align with the `Index` impl for `IntrinsicName`.
output.options[4] = concat!($unsigned_name, ".i8");
output.options[5] = concat!($unsigned_name, ".i16");
output.options[6] = concat!($unsigned_name, ".i32");
output.options[7] = concat!($unsigned_name, ".i64");
output.options[8] = concat!($unsigned_name, ".i128");
output.options[9] = concat!($signed_name, ".i8");
output.options[10] = concat!($signed_name, ".i16");
output.options[11] = concat!($signed_name, ".i32");
output.options[12] = concat!($signed_name, ".i64");
output.options[13] = concat!($signed_name, ".i128");
output
}};
($name:literal) => {
int_intrinsic!($name, $name)
};
}
pub const NUM_ASIN: IntrinsicName = float_intrinsic!("roc_builtins.num.asin");