Skip to content

Commit

Permalink
Replace {u,i}128_* lang items with __rust_{u,i}128_* unmangled functions
Browse files Browse the repository at this point in the history
The -Zlower-128bit-ops feature is completely broken, as libcore needs
those lang items to compile with this feature, but they are only
provided by compiler_builtins, which itself depends on libcore.
According to rust-lang/rust#58969 the feature never got finished.

This commit removes the associated lang items and replaces them with
normal unmangled functions, when there is no existing intrinsic. This
makes it easier for alternative codegen backends to implement 128bit
integer support.
  • Loading branch information
bjorn3 committed Jul 13, 2019
1 parent 5e06435 commit 783430e
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 99 deletions.
37 changes: 18 additions & 19 deletions src/int/addsub.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,44 +90,43 @@ where
impl Subo for i128 {}
impl Subo for u128 {}

u128_lang_items! {
#[lang = "i128_add"]
pub fn rust_i128_add(a: i128, b: i128) -> i128 {
rust_u128_add(a as _, b as _) as _
intrinsics! {
pub extern "C" fn __rust_i128_add(a: i128, b: i128) -> i128 {
__rust_u128_add(a as _, b as _) as _
}
#[lang = "i128_addo"]
pub fn rust_i128_addo(a: i128, b: i128) -> (i128, bool) {

pub extern "C" fn __rust_i128_addo(a: i128, b: i128) -> (i128, bool) {
let mut oflow = 0;
let r = a.addo(b, &mut oflow);
(r, oflow != 0)
}
#[lang = "u128_add"]
pub fn rust_u128_add(a: u128, b: u128) -> u128 {

pub extern "C" fn __rust_u128_add(a: u128, b: u128) -> u128 {
a.add(b)
}
#[lang = "u128_addo"]
pub fn rust_u128_addo(a: u128, b: u128) -> (u128, bool) {

pub extern "C" fn __rust_u128_addo(a: u128, b: u128) -> (u128, bool) {
let mut oflow = 0;
let r = a.addo(b, &mut oflow);
(r, oflow != 0)
}

#[lang = "i128_sub"]
pub fn rust_i128_sub(a: i128, b: i128) -> i128 {
rust_u128_sub(a as _, b as _) as _

pub extern "C" fn __rust_i128_sub(a: i128, b: i128) -> i128 {
__rust_u128_sub(a as _, b as _) as _
}
#[lang = "i128_subo"]
pub fn rust_i128_subo(a: i128, b: i128) -> (i128, bool) {

pub extern "C" fn __rust_i128_subo(a: i128, b: i128) -> (i128, bool) {
let mut oflow = 0;
let r = a.subo(b, &mut oflow);
(r, oflow != 0)
}
#[lang = "u128_sub"]
pub fn rust_u128_sub(a: u128, b: u128) -> u128 {

pub extern "C" fn __rust_u128_sub(a: u128, b: u128) -> u128 {
a.sub(b)
}
#[lang = "u128_subo"]
pub fn rust_u128_subo(a: u128, b: u128) -> (u128, bool) {

pub extern "C" fn __rust_u128_subo(a: u128, b: u128) -> (u128, bool) {
let mut oflow = 0;
let r = a.subo(b, &mut oflow);
(r, oflow != 0)
Expand Down
17 changes: 3 additions & 14 deletions src/int/mul.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,25 +107,14 @@ intrinsics! {
pub extern "C" fn __muloti4(a: i128, b: i128, oflow: &mut i32) -> i128 {
a.mulo(b, oflow)
}
}

u128_lang_items! {
#[lang = "i128_mul"]
pub fn rust_i128_mul(a: i128, b: i128) -> i128 {
__multi3(a, b)
}
#[lang = "i128_mulo"]
pub fn rust_i128_mulo(a: i128, b: i128) -> (i128, bool) {
pub extern "C" fn __rust_i128_mulo(a: i128, b: i128) -> (i128, bool) {
let mut oflow = 0;
let r = __muloti4(a, b, &mut oflow);
(r, oflow != 0)
}
#[lang = "u128_mul"]
pub fn rust_u128_mul(a: u128, b: u128) -> u128 {
__multi3(a as _, b as _) as _
}
#[lang = "u128_mulo"]
pub fn rust_u128_mulo(a: u128, b: u128) -> (u128, bool) {

pub extern "C" fn __rust_u128_mulo(a: u128, b: u128) -> (u128, bool) {
let mut oflow = 0;
let r = a.mulo(b, &mut oflow);
(r, oflow != 0)
Expand Down
11 changes: 0 additions & 11 deletions src/int/sdiv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,3 @@ intrinsics! {
a.divmod(b, rem, |a, b| __divdi3(a, b))
}
}

u128_lang_items! {
#[lang = "i128_div"]
pub fn rust_i128_div(a: i128, b: i128) -> i128 {
__divti3(a, b)
}
#[lang = "i128_rem"]
pub fn rust_i128_rem(a: i128, b: i128) -> i128 {
__modti3(a, b)
}
}
40 changes: 10 additions & 30 deletions src/int/shift.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,40 +103,20 @@ intrinsics! {
pub extern "C" fn __lshrti3(a: u128, b: u32) -> u128 {
a.lshr(b)
}
}

u128_lang_items! {
#[lang = "i128_shl"]
pub fn rust_i128_shl(a: i128, b: u32) -> i128 {
__ashlti3(a as _, b) as _
}
#[lang = "i128_shlo"]
pub fn rust_i128_shlo(a: i128, b: u128) -> (i128, bool) {
(rust_i128_shl(a, b as _), b >= 128)
}
#[lang = "u128_shl"]
pub fn rust_u128_shl(a: u128, b: u32) -> u128 {
__ashlti3(a, b)
}
#[lang = "u128_shlo"]
pub fn rust_u128_shlo(a: u128, b: u128) -> (u128, bool) {
(rust_u128_shl(a, b as _), b >= 128)
pub extern "C" fn __rust_i128_shlo(a: i128, b: u128) -> (i128, bool) {
(__ashlti3(a as _, b as _) as _, b >= 128)
}

#[lang = "i128_shr"]
pub fn rust_i128_shr(a: i128, b: u32) -> i128 {
__ashrti3(a, b)
pub extern "C" fn __rust_u128_shlo(a: u128, b: u128) -> (u128, bool) {
(__ashlti3(a, b as _), b >= 128)
}
#[lang = "i128_shro"]
pub fn rust_i128_shro(a: i128, b: u128) -> (i128, bool) {
(rust_i128_shr(a, b as _), b >= 128)
}
#[lang = "u128_shr"]
pub fn rust_u128_shr(a: u128, b: u32) -> u128 {
__lshrti3(a, b)

pub extern "C" fn __rust_i128_shro(a: i128, b: u128) -> (i128, bool) {
(__ashrti3(a, b as _), b >= 128)
}
#[lang = "u128_shro"]
pub fn rust_u128_shro(a: u128, b: u128) -> (u128, bool) {
(rust_u128_shr(a, b as _), b >= 128)

pub extern "C" fn __rust_u128_shro(a: u128, b: u128) -> (u128, bool) {
(__lshrti3(a, b as _), b >= 128)
}
}
11 changes: 0 additions & 11 deletions src/int/udiv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -268,14 +268,3 @@ intrinsics! {
udivmod_inner!(n, d, rem, u128)
}
}

u128_lang_items! {
#[lang = "u128_div"]
pub fn rust_u128_div(a: u128, b: u128) -> u128 {
__udivti3(a, b)
}
#[lang = "u128_rem"]
pub fn rust_u128_rem(a: u128, b: u128) -> u128 {
__umodti3(a, b)
}
}
14 changes: 0 additions & 14 deletions src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,17 +280,3 @@ pub mod win64_128bit_abi_hack {
}
}
}

macro_rules! u128_lang_items {
($(
#[lang = $lang:tt]
pub fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
$($body:tt)*
}
)*) => ($(
#[cfg_attr(not(any(stage0, feature = "no-lang-items")), lang = $lang)]
pub fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
)*)
}

0 comments on commit 783430e

Please sign in to comment.