Skip to content

Commit 044264a

Browse files
committed
intrinsics : uabs and iabs
1 parent 3f719a3 commit 044264a

File tree

1 file changed

+26
-13
lines changed
  • src/libcompiler_builtins

1 file changed

+26
-13
lines changed

src/libcompiler_builtins/lib.rs

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,12 @@ pub mod reimpls {
292292

293293
#[export_name="__modti3"]
294294
pub extern fn i128_mod(a: i128_, b: i128_) -> i128_ {
295-
let b = b.abs();
295+
let b = b.uabs();
296296
let sa = a.signum();
297-
let a = a.abs();
297+
let a = a.uabs();
298298
unsafe {
299299
let mut r = ::core::mem::zeroed();
300-
u128_div_mod(a as u128_, b as u128_, &mut r);
300+
u128_div_mod(a, b, &mut r);
301301
if sa == -1 { -(r as i128_) } else { r as i128_ }
302302
}
303303
}
@@ -306,13 +306,13 @@ pub mod reimpls {
306306
pub extern fn i128_div(a: i128_, b: i128_) -> i128_ {
307307
let sa = a.signum();
308308
let sb = b.signum();
309-
let a = a.abs();
310-
let b = b.abs();
309+
let a = a.uabs();
310+
let b = b.uabs();
311311
let sr = sa * sb; // sign of quotient
312312
if sr == -1 {
313-
-(u128_div_mod(a as u128_, b as u128_, ptr::null_mut()) as i128_)
313+
-(u128_div_mod(a, b, ptr::null_mut()) as i128_)
314314
} else {
315-
u128_div_mod(a as u128_, b as u128_, ptr::null_mut()) as i128_
315+
u128_div_mod(a, b, ptr::null_mut()) as i128_
316316
}
317317
}
318318

@@ -340,9 +340,9 @@ pub mod reimpls {
340340
}
341341

342342
let sa = a.signum();
343-
let abs_a = a.abs();
343+
let abs_a = a.iabs();
344344
let sb = b.signum();
345-
let abs_b = b.abs();
345+
let abs_b = b.iabs();
346346
if abs_a < 2 || abs_b < 2 {
347347
return result;
348348
}
@@ -473,6 +473,19 @@ pub mod reimpls {
473473
mul!(a, b, i128_, i64)
474474
}
475475

476+
trait AbsExt: Sized {
477+
fn uabs(self) -> u128_ {
478+
self.iabs() as u128_
479+
}
480+
fn iabs(self) -> i128_;
481+
}
482+
483+
impl AbsExt for i128_ {
484+
fn iabs(self) -> i128_ {
485+
((self ^ self).wrapping_sub(self))
486+
}
487+
}
488+
476489
trait FloatStuff: Sized {
477490
type ToBytes;
478491

@@ -579,19 +592,19 @@ pub mod reimpls {
579592
#[export_name="__floattidf"]
580593
pub extern fn i128_as_f64(a: i128_) -> f64 {
581594
match a.signum() {
582-
1 => u128_as_f64(a.abs() as u128_),
595+
1 => u128_as_f64(a.uabs()),
583596
0 => 0.0,
584-
-1 => -u128_as_f64(a.abs() as u128_),
597+
-1 => -u128_as_f64(a.uabs()),
585598
_ => unimplemented()
586599
}
587600
}
588601

589602
#[export_name="__floattisf"]
590603
pub extern fn i128_as_f32(a: i128_) -> f32 {
591604
match a.signum() {
592-
1 => u128_as_f32(a.abs() as u128_),
605+
1 => u128_as_f32(a.uabs()),
593606
0 => 0.0,
594-
-1 => -u128_as_f32(a.abs() as u128_),
607+
-1 => -u128_as_f32(a.uabs()),
595608
_ => unimplemented()
596609
}
597610
}

0 commit comments

Comments
 (0)