Skip to content

Commit

Permalink
uefi-std: Drop fmodf
Browse files Browse the repository at this point in the history
Some math functions are exposed through compiler-builtins on newer
releases.

Fixes building system76/firmware-setup with new toolchain.

Ref: rust-lang/compiler-builtins#435
Signed-off-by: Tim Crawford <tcrawford@system76.com>
  • Loading branch information
crawfxrd committed Apr 4, 2022
1 parent e86e618 commit c1e64ff
Showing 1 changed file with 0 additions and 118 deletions.
118 changes: 0 additions & 118 deletions crates/uefi_std/src/rt/math.rs
Original file line number Diff line number Diff line change
@@ -1,121 +1,3 @@
/*
* Copyright (c) 2018 Jorge Aparicio
*
* Permission is hereby granted, free of charge, to any
* person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the
* Software without restriction, including without
* limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software
* is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice
* shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/

use core::f32;
use core::u32;

#[no_mangle]
pub fn fmodf(x: f32, y: f32) -> f32 {
let mut uxi = x.to_bits();
let mut uyi = y.to_bits();
let mut ex = (uxi >> 23 & 0xff) as i32;
let mut ey = (uyi >> 23 & 0xff) as i32;
let sx = uxi & 0x80000000;
let mut i;

if uyi << 1 == 0 || y.is_nan() || ex == 0xff {
return (x * y) / (x * y);
}

if uxi << 1 <= uyi << 1 {
if uxi << 1 == uyi << 1 {
return 0.0 * x;
}

return x;
}

/* normalize x and y */
if ex == 0 {
i = uxi << 9;
while i >> 31 == 0 {
ex -= 1;
i <<= 1;
}

uxi <<= -ex + 1;
} else {
uxi &= u32::MAX >> 9;
uxi |= 1 << 23;
}

if ey == 0 {
i = uyi << 9;
while i >> 31 == 0 {
ey -= 1;
i <<= 1;
}

uyi <<= -ey + 1;
} else {
uyi &= u32::MAX >> 9;
uyi |= 1 << 23;
}

/* x mod y */
while ex > ey {
i = uxi - uyi;
if i >> 31 == 0 {
if i == 0 {
return 0.0 * x;
}
uxi = i;
}
uxi <<= 1;

ex -= 1;
}

i = uxi - uyi;
if i >> 31 == 0 {
if i == 0 {
return 0.0 * x;
}
uxi = i;
}

while uxi >> 23 == 0 {
uxi <<= 1;
ex -= 1;
}

/* scale result up */
if ex > 0 {
uxi -= 1 << 23;
uxi |= (ex as u32) << 23;
} else {
uxi >>= -ex + 1;
}
uxi |= sx;

f32::from_bits(uxi)
}

/* origin: FreeBSD /usr/src/lib/msun/src/e_sqrtf.c */
/*
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
Expand Down

0 comments on commit c1e64ff

Please sign in to comment.