|
@@ -22,17 +22,73 @@ I32_MAX :: -I32_MIN - 1;
|
|
|
I64_MAX :: -I64_MIN - 1;
|
|
|
I128_MAX :: -I128_MIN - 1;
|
|
|
|
|
|
+foreign __llvm_core {
|
|
|
+ @(link_name="llvm.ctpop.i8") __llvm_ctpop :: proc(u8) -> u8 ---;
|
|
|
+ @(link_name="llvm.ctpop.i8") __llvm_ctpop :: proc(i8) -> i8 ---;
|
|
|
+ @(link_name="llvm.ctpop.i16") __llvm_ctpop :: proc(u16) -> u16 ---;
|
|
|
+ @(link_name="llvm.ctpop.i16") __llvm_ctpop :: proc(i16) -> i16 ---;
|
|
|
+ @(link_name="llvm.ctpop.i32") __llvm_ctpop :: proc(u32) -> u32 ---;
|
|
|
+ @(link_name="llvm.ctpop.i32") __llvm_ctpop :: proc(i32) -> i32 ---;
|
|
|
+ @(link_name="llvm.ctpop.i64") __llvm_ctpop :: proc(u64) -> u64 ---;
|
|
|
+ @(link_name="llvm.ctpop.i64") __llvm_ctpop :: proc(i64) -> i64 ---;
|
|
|
+ @(link_name="llvm.ctpop.i128") __llvm_ctpop :: proc(u128) -> u128 ---;
|
|
|
+ @(link_name="llvm.ctpop.i128") __llvm_ctpop :: proc(i128) -> i128 ---;
|
|
|
+
|
|
|
+ @(link_name="llvm.ctlz.i8") __llvm_ctlz :: proc(u8, bool) -> u8 ---;
|
|
|
+ @(link_name="llvm.ctlz.i8") __llvm_ctlz :: proc(i8, bool) -> i8 ---;
|
|
|
+ @(link_name="llvm.ctlz.i16") __llvm_ctlz :: proc(u16, bool) -> u16 ---;
|
|
|
+ @(link_name="llvm.ctlz.i16") __llvm_ctlz :: proc(i16, bool) -> i16 ---;
|
|
|
+ @(link_name="llvm.ctlz.i32") __llvm_ctlz :: proc(u32, bool) -> u32 ---;
|
|
|
+ @(link_name="llvm.ctlz.i32") __llvm_ctlz :: proc(i32, bool) -> i32 ---;
|
|
|
+ @(link_name="llvm.ctlz.i64") __llvm_ctlz :: proc(u64, bool) -> u64 ---;
|
|
|
+ @(link_name="llvm.ctlz.i64") __llvm_ctlz :: proc(i64, bool) -> i64 ---;
|
|
|
+ @(link_name="llvm.ctlz.i128") __llvm_ctlz :: proc(u128, bool) -> u128 ---;
|
|
|
+ @(link_name="llvm.ctlz.i128") __llvm_ctlz :: proc(i128, bool) -> i128 ---;
|
|
|
+
|
|
|
+ @(link_name="llvm.cttz.i8") __llvm_cttz :: proc(u8, bool) -> u8 ---;
|
|
|
+ @(link_name="llvm.cttz.i8") __llvm_cttz :: proc(i8, bool) -> i8 ---;
|
|
|
+ @(link_name="llvm.cttz.i16") __llvm_cttz :: proc(u16, bool) -> u16 ---;
|
|
|
+ @(link_name="llvm.cttz.i16") __llvm_cttz :: proc(i16, bool) -> i16 ---;
|
|
|
+ @(link_name="llvm.cttz.i32") __llvm_cttz :: proc(u32, bool) -> u32 ---;
|
|
|
+ @(link_name="llvm.cttz.i32") __llvm_cttz :: proc(i32, bool) -> i32 ---;
|
|
|
+ @(link_name="llvm.cttz.i64") __llvm_cttz :: proc(u64, bool) -> u64 ---;
|
|
|
+ @(link_name="llvm.cttz.i64") __llvm_cttz :: proc(i64, bool) -> i64 ---;
|
|
|
+ @(link_name="llvm.cttz.i128") __llvm_cttz :: proc(u128, bool) -> u128 ---;
|
|
|
+ @(link_name="llvm.cttz.i128") __llvm_cttz :: proc(i128, bool) -> i128 ---;
|
|
|
+
|
|
|
+ @(link_name="llvm.bitreverse.i8") __llvm_bitreverse :: proc(u8) -> u8 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i8") __llvm_bitreverse :: proc(i8) -> i8 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i16") __llvm_bitreverse :: proc(u16) -> u16 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i16") __llvm_bitreverse :: proc(i16) -> i16 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i32") __llvm_bitreverse :: proc(u32) -> u32 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i32") __llvm_bitreverse :: proc(i32) -> i32 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i64") __llvm_bitreverse :: proc(u64) -> u64 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i64") __llvm_bitreverse :: proc(i64) -> i64 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i128") __llvm_bitreverse :: proc(u128) -> u128 ---;
|
|
|
+ @(link_name="llvm.bitreverse.i128") __llvm_bitreverse :: proc(i128) -> i128 ---;
|
|
|
+
|
|
|
+ @(link_name="llvm.bswap.i16") byte_swap :: proc(u16) -> u16 ---;
|
|
|
+ @(link_name="llvm.bswap.i16") byte_swap :: proc(i16) -> i16 ---;
|
|
|
+ @(link_name="llvm.bswap.i32") byte_swap :: proc(u32) -> u32 ---;
|
|
|
+ @(link_name="llvm.bswap.i32") byte_swap :: proc(i32) -> i32 ---;
|
|
|
+ @(link_name="llvm.bswap.i64") byte_swap :: proc(u64) -> u64 ---;
|
|
|
+ @(link_name="llvm.bswap.i64") byte_swap :: proc(i64) -> i64 ---;
|
|
|
+ @(link_name="llvm.bswap.i128") byte_swap :: proc(u128) -> u128 ---;
|
|
|
+ @(link_name="llvm.bswap.i128") byte_swap :: proc(i128) -> i128 ---;
|
|
|
+}
|
|
|
+byte_swap :: proc(i: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(byte_swap(u32(i))); } else { return uint(byte_swap(u64(i))); } }
|
|
|
+byte_swap :: proc(i: int) -> int { when size_of(int) == size_of(i32) { return int(byte_swap(i32(i))); } else { return int(byte_swap(i64(i))); } }
|
|
|
|
|
|
-count_ones :: proc(i: u8) -> u8 { foreign __llvm_core @(link_name="llvm.ctpop.i8") __llvm_ctpop :: proc(u8) -> u8 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: i8) -> i8 { foreign __llvm_core @(link_name="llvm.ctpop.i8") __llvm_ctpop :: proc(i8) -> i8 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: u16) -> u16 { foreign __llvm_core @(link_name="llvm.ctpop.i16") __llvm_ctpop :: proc(u16) -> u16 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: i16) -> i16 { foreign __llvm_core @(link_name="llvm.ctpop.i16") __llvm_ctpop :: proc(i16) -> i16 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: u32) -> u32 { foreign __llvm_core @(link_name="llvm.ctpop.i32") __llvm_ctpop :: proc(u32) -> u32 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: i32) -> i32 { foreign __llvm_core @(link_name="llvm.ctpop.i32") __llvm_ctpop :: proc(i32) -> i32 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: u64) -> u64 { foreign __llvm_core @(link_name="llvm.ctpop.i64") __llvm_ctpop :: proc(u64) -> u64 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: i64) -> i64 { foreign __llvm_core @(link_name="llvm.ctpop.i64") __llvm_ctpop :: proc(i64) -> i64 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: u128) -> u128 { foreign __llvm_core @(link_name="llvm.ctpop.i128") __llvm_ctpop :: proc(u128) -> u128 ---; return __llvm_ctpop(i); }
|
|
|
-count_ones :: proc(i: i128) -> i128 { foreign __llvm_core @(link_name="llvm.ctpop.i128") __llvm_ctpop :: proc(i128) -> i128 ---; return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: u8) -> u8 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: i8) -> i8 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: u16) -> u16 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: i16) -> i16 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: u32) -> u32 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: i32) -> i32 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: u64) -> u64 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: i64) -> i64 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: u128) -> u128 { return __llvm_ctpop(i); }
|
|
|
+count_ones :: proc(i: i128) -> i128 { return __llvm_ctpop(i); }
|
|
|
count_ones :: proc(i: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(count_ones(u32(i))); } else { return uint(count_ones(u64(i))); } }
|
|
|
count_ones :: proc(i: int) -> int { when size_of(int) == size_of(i32) { return int(count_ones(i32(i))); } else { return int(count_ones(i64(i))); } }
|
|
|
|
|
@@ -77,60 +133,46 @@ rotate_right :: proc(i: i128, s: uint) -> i128 { return (i >> s)|(i << (8*size_o
|
|
|
rotate_right :: proc(i: uint, s: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(rotate_right(u32(i), s)); } else { return uint(rotate_right(u64(i), s)); } }
|
|
|
rotate_right :: proc(i: int, s: uint) -> int { when size_of(int) == size_of(i32) { return int(rotate_right(i32(i), s)); } else { return int(rotate_right(i64(i), s)); } }
|
|
|
|
|
|
-
|
|
|
-leading_zeros :: proc(i: u8) -> u8 { foreign __llvm_core @(link_name="llvm.ctlz.i8") __llvm_ctlz :: proc(u8, bool) -> u8 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: i8) -> i8 { foreign __llvm_core @(link_name="llvm.ctlz.i8") __llvm_ctlz :: proc(i8, bool) -> i8 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: u16) -> u16 { foreign __llvm_core @(link_name="llvm.ctlz.i16") __llvm_ctlz :: proc(u16, bool) -> u16 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: i16) -> i16 { foreign __llvm_core @(link_name="llvm.ctlz.i16") __llvm_ctlz :: proc(i16, bool) -> i16 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: u32) -> u32 { foreign __llvm_core @(link_name="llvm.ctlz.i32") __llvm_ctlz :: proc(u32, bool) -> u32 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: i32) -> i32 { foreign __llvm_core @(link_name="llvm.ctlz.i32") __llvm_ctlz :: proc(i32, bool) -> i32 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: u64) -> u64 { foreign __llvm_core @(link_name="llvm.ctlz.i64") __llvm_ctlz :: proc(u64, bool) -> u64 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: i64) -> i64 { foreign __llvm_core @(link_name="llvm.ctlz.i64") __llvm_ctlz :: proc(i64, bool) -> i64 ---; return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: u128) -> u128 { foreign __llvm_core @(link_name="llvm.ctlz.i128") __llvm_ctlz :: proc(u128, bool) -> u128 ---;return __llvm_ctlz(i, false); }
|
|
|
-leading_zeros :: proc(i: i128) -> i128 { foreign __llvm_core @(link_name="llvm.ctlz.i128") __llvm_ctlz :: proc(i128, bool) -> i128 ---;return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: u8) -> u8 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: i8) -> i8 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: u16) -> u16 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: i16) -> i16 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: u32) -> u32 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: i32) -> i32 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: u64) -> u64 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: i64) -> i64 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: u128) -> u128 { return __llvm_ctlz(i, false); }
|
|
|
+leading_zeros :: proc(i: i128) -> i128 { return __llvm_ctlz(i, false); }
|
|
|
leading_zeros :: proc(i: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(leading_zeros(u32(i))); } else { return uint(leading_zeros(u64(i))); } }
|
|
|
leading_zeros :: proc(i: int) -> int { when size_of(int) == size_of(i32) { return int(leading_zeros(i32(i))); } else { return int(leading_zeros(i64(i))); } }
|
|
|
|
|
|
-trailing_zeros :: proc(i: u8) -> u8 { foreign __llvm_core @(link_name="llvm.cttz.i8") __llvm_cttz :: proc(u8, bool) -> u8 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: i8) -> i8 { foreign __llvm_core @(link_name="llvm.cttz.i8") __llvm_cttz :: proc(i8, bool) -> i8 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: u16) -> u16 { foreign __llvm_core @(link_name="llvm.cttz.i16") __llvm_cttz :: proc(u16, bool) -> u16 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: i16) -> i16 { foreign __llvm_core @(link_name="llvm.cttz.i16") __llvm_cttz :: proc(i16, bool) -> i16 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: u32) -> u32 { foreign __llvm_core @(link_name="llvm.cttz.i32") __llvm_cttz :: proc(u32, bool) -> u32 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: i32) -> i32 { foreign __llvm_core @(link_name="llvm.cttz.i32") __llvm_cttz :: proc(i32, bool) -> i32 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: u64) -> u64 { foreign __llvm_core @(link_name="llvm.cttz.i64") __llvm_cttz :: proc(u64, bool) -> u64 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: i64) -> i64 { foreign __llvm_core @(link_name="llvm.cttz.i64") __llvm_cttz :: proc(i64, bool) -> i64 ---; return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: u128) -> u128 { foreign __llvm_core @(link_name="llvm.cttz.i128") __llvm_cttz :: proc(u128, bool) -> u128 ---;return __llvm_cttz(i, false); }
|
|
|
-trailing_zeros :: proc(i: i128) -> i128 { foreign __llvm_core @(link_name="llvm.cttz.i128") __llvm_cttz :: proc(i128, bool) -> i128 ---;return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: u8) -> u8 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: i8) -> i8 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: u16) -> u16 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: i16) -> i16 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: u32) -> u32 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: i32) -> i32 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: u64) -> u64 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: i64) -> i64 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: u128) -> u128 { return __llvm_cttz(i, false); }
|
|
|
+trailing_zeros :: proc(i: i128) -> i128 { return __llvm_cttz(i, false); }
|
|
|
trailing_zeros :: proc(i: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(trailing_zeros(u32(i))); } else { return uint(trailing_zeros(u64(i))); } }
|
|
|
trailing_zeros :: proc(i: int) -> int { when size_of(int) == size_of(i32) { return int(trailing_zeros(i32(i))); } else { return int(trailing_zeros(i64(i))); } }
|
|
|
|
|
|
|
|
|
-reverse_bits :: proc(i: u8) -> u8 { foreign __llvm_core @(link_name="llvm.bitreverse.i8") __llvm_bitreverse :: proc(u8) -> u8 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: i8) -> i8 { foreign __llvm_core @(link_name="llvm.bitreverse.i8") __llvm_bitreverse :: proc(i8) -> i8 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: u16) -> u16 { foreign __llvm_core @(link_name="llvm.bitreverse.i16") __llvm_bitreverse :: proc(u16) -> u16 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: i16) -> i16 { foreign __llvm_core @(link_name="llvm.bitreverse.i16") __llvm_bitreverse :: proc(i16) -> i16 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: u32) -> u32 { foreign __llvm_core @(link_name="llvm.bitreverse.i32") __llvm_bitreverse :: proc(u32) -> u32 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: i32) -> i32 { foreign __llvm_core @(link_name="llvm.bitreverse.i32") __llvm_bitreverse :: proc(i32) -> i32 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: u64) -> u64 { foreign __llvm_core @(link_name="llvm.bitreverse.i64") __llvm_bitreverse :: proc(u64) -> u64 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: i64) -> i64 { foreign __llvm_core @(link_name="llvm.bitreverse.i64") __llvm_bitreverse :: proc(i64) -> i64 ---; return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: u128) -> u128 { foreign __llvm_core @(link_name="llvm.bitreverse.i128") __llvm_bitreverse :: proc(u128) -> u128 ---;return __llvm_bitreverse(i); }
|
|
|
-reverse_bits :: proc(i: i128) -> i128 { foreign __llvm_core @(link_name="llvm.bitreverse.i128") __llvm_bitreverse :: proc(i128) -> i128 ---;return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: u8) -> u8 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: i8) -> i8 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: u16) -> u16 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: i16) -> i16 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: u32) -> u32 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: i32) -> i32 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: u64) -> u64 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: i64) -> i64 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: u128) -> u128 { return __llvm_bitreverse(i); }
|
|
|
+reverse_bits :: proc(i: i128) -> i128 { return __llvm_bitreverse(i); }
|
|
|
reverse_bits :: proc(i: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(reverse_bits(u32(i))); } else { return uint(reverse_bits(u64(i))); } }
|
|
|
reverse_bits :: proc(i: int) -> int { when size_of(int) == size_of(i32) { return int(reverse_bits(i32(i))); } else { return int(reverse_bits(i64(i))); } }
|
|
|
|
|
|
-foreign __llvm_core {
|
|
|
- @(link_name="llvm.bswap.i16") byte_swap :: proc(u16) -> u16 ---;
|
|
|
- @(link_name="llvm.bswap.i16") byte_swap :: proc(i16) -> i16 ---;
|
|
|
- @(link_name="llvm.bswap.i32") byte_swap :: proc(u32) -> u32 ---;
|
|
|
- @(link_name="llvm.bswap.i32") byte_swap :: proc(i32) -> i32 ---;
|
|
|
- @(link_name="llvm.bswap.i64") byte_swap :: proc(u64) -> u64 ---;
|
|
|
- @(link_name="llvm.bswap.i64") byte_swap :: proc(i64) -> i64 ---;
|
|
|
- @(link_name="llvm.bswap.i128") byte_swap :: proc(u128) -> u128 ---;
|
|
|
- @(link_name="llvm.bswap.i128") byte_swap :: proc(i128) -> i128 ---;
|
|
|
-}
|
|
|
-byte_swap :: proc(i: uint) -> uint { when size_of(uint) == size_of(u32) { return uint(byte_swap(u32(i))); } else { return uint(byte_swap(u64(i))); } }
|
|
|
-byte_swap :: proc(i: int) -> int { when size_of(int) == size_of(i32) { return int(byte_swap(i32(i))); } else { return int(byte_swap(i64(i))); } }
|
|
|
-
|
|
|
from_be :: proc(i: u8) -> u8 { return i; }
|
|
|
from_be :: proc(i: i8) -> i8 { return i; }
|
|
|
from_be :: proc(i: u16) -> u16 { when ODIN_ENDIAN == "big" { return i; } else { return byte_swap(i); } }
|