aboutsummaryrefslogtreecommitdiff
path: root/core/runtime/internal_linux.odin
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-25 20:22:26 +0100
committergingerBill <bill@gingerbill.org>2021-04-25 20:22:26 +0100
commit72aa0e6e3891c034863476751b2aefda781de5b2 (patch)
treefc49f4821dcb900a30d472803e5340587c1cd65a /core/runtime/internal_linux.odin
parentcb2e6ea31db90ca80314e5ff8ce8f43371fade7c (diff)
Replace many `foreign` llvm calls with intrinsics
Diffstat (limited to 'core/runtime/internal_linux.odin')
-rw-r--r--core/runtime/internal_linux.odin10
1 files changed, 3 insertions, 7 deletions
diff --git a/core/runtime/internal_linux.odin b/core/runtime/internal_linux.odin
index aecd7f601..1e1a25bb8 100644
--- a/core/runtime/internal_linux.odin
+++ b/core/runtime/internal_linux.odin
@@ -1,5 +1,7 @@
package runtime
+import "intrinsics"
+
@(link_name="__umodti3")
umodti3 :: proc "c" (a, b: u128) -> u128 {
r: u128 = ---;
@@ -86,12 +88,6 @@ fixdfti :: proc(a: u64) -> i128 {
}
-@(default_calling_convention = "none")
-foreign {
- @(link_name="llvm.ctlz.i128") _clz_i128 :: proc(x: i128, is_zero_undef := false) -> i128 ---
-}
-
-
@(link_name="__floattidf")
floattidf :: proc(a: i128) -> f64 {
DBL_MANT_DIG :: 53;
@@ -102,7 +98,7 @@ floattidf :: proc(a: i128) -> f64 {
N :: size_of(i128) * 8;
s := a >> (N-1);
a = (a ~ s) - s;
- sd: = N - _clz_i128(a); // number of significant digits
+ sd: = N - intrinsics.leading_zeros(a); // number of significant digits
e := u32(sd - 1); // exponent
if sd > DBL_MANT_DIG {
switch sd {