core/math/bits
math_bits
Constants
28I16_MAX
I16_MAX :: 1 << 15 - 1SourceThe maximum value held by an i16. The same value as max(i16), except untyped.
I16_MIN
I16_MIN :: - 1 << 15SourceThe minimum value held by an i16. The same value as min(i16), except untyped.
I32_MAX
I32_MAX :: 1 << 31 - 1SourceThe maximum value held by an i32. The same value as max(i32), except untyped.
I32_MIN
I32_MIN :: - 1 << 31SourceThe minimum value held by an i32. The same value as min(i32), except untyped.
I64_MAX
I64_MAX :: 1 << 63 - 1SourceThe maximum value held by an i64. The same value as max(i64), except untyped.
I64_MIN
I64_MIN :: - 1 << 63SourceThe minimum value held by an i64. The same value as min(i64), except untyped.
I8_MAX
I8_MAX :: 1 << 7 - 1SourceThe maximum value held by an i8. The same value as max(i8), except untyped.
I8_MIN
I8_MIN :: - 1 << 7SourceThe minimum value held by an i8. The same value as min(i8), except untyped.
U16_MAX
U16_MAX :: 1 << 16 - 1SourceThe maximum value held by a u16. The same value as max(u16), except untyped.
U16_MIN
U16_MIN :: 0SourceThe minimum value held by a u16. The same value as min(u16), except untyped.
U32_MAX
U32_MAX :: 1 << 32 - 1SourceThe maximum value held by a u32. The same value as max(u32), except untyped.
U32_MIN
U32_MIN :: 0SourceThe minimum value held by a u32. The same value as min(u32), except untyped.
U64_MAX
U64_MAX :: 1 << 64 - 1SourceThe maximum value held by a u64. The same value as max(u64), except untyped.
U64_MIN
U64_MIN :: 0SourceThe minimum value held by a u64. The same value as min(u64), except untyped.
U8_MAX
U8_MAX :: 1 << 8 - 1SourceThe maximum value held by a u8. The same value as max(u8), except untyped.
U8_MIN
U8_MIN :: 0SourceThe minimum value held by a u8. The same value as min(u8), except untyped.
UINT_MIN
UINT_MIN :: 0SourceThe minimum value held by a uint. The same value as min(uint), except untyped.
byte_swap
byte_swap :: intrinsics.byte_swapSourcecount_leading_zeros
count_leading_zeros :: intrinsics.count_leading_zerosSourcecount_ones
count_ones :: intrinsics.count_onesSourcecount_trailing_zeros
count_trailing_zeros :: intrinsics.count_trailing_zerosSourcecount_zeros
count_zeros :: intrinsics.count_zerosSourceleading_zeros
leading_zeros :: intrinsics.count_leading_zerosSourceoverflowing_add
overflowing_add :: intrinsics.overflow_addSourceoverflowing_mul
overflowing_mul :: intrinsics.overflow_mulSourceoverflowing_sub
overflowing_sub :: intrinsics.overflow_subSourcereverse_bits
reverse_bits :: intrinsics.reverse_bitsSourcetrailing_zeros
trailing_zeros :: intrinsics.count_trailing_zerosSourceProcedures
77add_u32
add_u32 :: proc(x: u32, y: u32, carry: u32) -> (sum: u32, carry_out: u32)SourceAdd with carry
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- carry: Carry in
Returns:
- sum: The sum
- carry_out: Carry out
add_u64
add_u64 :: proc(x: u64, y: u64, carry: u64) -> (sum: u64, carry_out: u64)SourceAdd with carry
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- carry: Carry in
Returns:
- sum: The sum
- carry_out: Carry out
add_uint
add_uint :: proc(x: uint, y: uint, carry: uint) -> (sum: uint, carry_out: uint)SourceAdd with carry
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- carry: Carry in
Returns:
- sum: The sum
- carry_out: Carry out
bitfield_extract_i128
bitfield_extract_i128 :: proc(value: i128, offset: uint, bits: uint) -> (i128)SourceExtracts bits from a signed integer
Inputs:
- value: Signed integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_i16
bitfield_extract_i16 :: proc(value: i16, offset: uint, bits: uint) -> (i16)SourceExtracts bits from a signed integer
Inputs:
- value: Signed integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_i32
bitfield_extract_i32 :: proc(value: i32, offset: uint, bits: uint) -> (i32)SourceExtracts bits from a signed integer
Inputs:
- value: Signed integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_i64
bitfield_extract_i64 :: proc(value: i64, offset: uint, bits: uint) -> (i64)SourceExtracts bits from a signed integer
Inputs:
- value: Signed integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_i8
bitfield_extract_i8 :: proc(value: i8, offset: uint, bits: uint) -> (i8)SourceExtracts bits from a signed integer
Inputs:
- value: Signed integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_int
bitfield_extract_int :: proc(value: int, offset: uint, bits: uint) -> (int)SourceExtracts bits from a signed integer
Inputs:
- value: Signed integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_u128
bitfield_extract_u128 :: proc(value: u128, offset: uint, bits: uint) -> (res: u128)SourceExtracts bits from an unsigned integer
Inputs:
- value: Unsigned integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_u16
bitfield_extract_u16 :: proc(value: u16, offset: uint, bits: uint) -> (res: u16)SourceExtracts bits from an unsigned integer
Inputs:
- value: Unsigned integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_u32
bitfield_extract_u32 :: proc(value: u32, offset: uint, bits: uint) -> (res: u32)SourceExtracts bits from an unsigned integer
Inputs:
- value: Unsigned integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_u64
bitfield_extract_u64 :: proc(value: u64, offset: uint, bits: uint) -> (res: u64)SourceExtracts bits from an unsigned integer
Inputs:
- value: Unsigned integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_u8
bitfield_extract_u8 :: proc(value: u8, offset: uint, bits: uint) -> (res: u8)SourceExtracts bits from an unsigned integer
Inputs:
- value: Unsigned integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_extract_uint
bitfield_extract_uint :: proc(value: uint, offset: uint, bits: uint) -> (res: uint)SourceExtracts bits from an unsigned integer
Inputs:
- value: Unsigned integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_insert_i128
bitfield_insert_i128 :: proc(base: i128, insert: i128, offset: uint, bits: uint) -> (res: i128)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_i16
bitfield_insert_i16 :: proc(base: i16, insert: i16, offset: uint, bits: uint) -> (res: i16)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_i32
bitfield_insert_i32 :: proc(base: i32, insert: i32, offset: uint, bits: uint) -> (res: i32)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_i64
bitfield_insert_i64 :: proc(base: i64, insert: i64, offset: uint, bits: uint) -> (res: i64)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_i8
bitfield_insert_i8 :: proc(base: i8, insert: i8, offset: uint, bits: uint) -> (res: i8)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_int
bitfield_insert_int :: proc(base: int, insert: int, offset: uint, bits: uint) -> (res: int)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_u128
bitfield_insert_u128 :: proc(base: u128, insert: u128, offset: uint, bits: uint) -> (res: u128)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_u16
bitfield_insert_u16 :: proc(base: u16, insert: u16, offset: uint, bits: uint) -> (res: u16)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_u32
bitfield_insert_u32 :: proc(base: u32, insert: u32, offset: uint, bits: uint) -> (res: u32)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_u64
bitfield_insert_u64 :: proc(base: u64, insert: u64, offset: uint, bits: uint) -> (res: u64)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_u8
bitfield_insert_u8 :: proc(base: u8, insert: u8, offset: uint, bits: uint) -> (res: u8)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
bitfield_insert_uint
bitfield_insert_uint :: proc(base: uint, insert: uint, offset: uint, bits: uint) -> (res: uint)SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
div_u32
div_u32 :: proc(hi: u32, lo: u32, y: u32) -> (quo: u32, rem: u32)SourceDivide a 64-bit unsigned integer (in two 32-bit words) by a 32-bit divisor
Inputs:
- hi: High word of 64-bit integer
- lo: Low word of 64-bit integer
- y: Divisor
Returns:
- quo: 32-bit quotient
- rem: 32-bit remainder
div_u64
div_u64 :: proc(hi: u64, lo: u64, y: u64) -> (quo: u64, rem: u64)SourceDivide a 128-bit unsigned integer (in two 64-bit words) by a 64-bit divisor
Inputs:
- hi: High word of 128-bit integer
- lo: Low word of 128-bit integer
- y: Divisor
Returns:
- quo: 64-bit quotient
- rem: 64-bit Remainder
div_uint
div_uint :: proc(hi: uint, lo: uint, y: uint) -> (quo: uint, rem: uint)SourceDivide an unsigned integer (in two words) by a divisor
Inputs:
- hi: High word of input
- lo: Low word of input
- y: Divisor
Returns:
- quo: Quotient
- rem: Remainder
from_be_u16
from_be_u16 :: proc(i: u16) -> (u16)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_be_u32
from_be_u32 :: proc(i: u32) -> (u32)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_be_u64
from_be_u64 :: proc(i: u64) -> (u64)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_be_u8
from_be_u8 :: proc(i: u8) -> (u8)SourceReturns unsigned integer i
NOTE: A byte has no endianness, so from_be_u8 exists to be complementary to from_be_*.
Inputs:
- i: The unsigned integer
Returns:
- res:
i
from_be_uint
from_be_uint :: proc(i: uint) -> (uint)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_le_u16
from_le_u16 :: proc(i: u16) -> (u16)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_le_u32
from_le_u32 :: proc(i: u32) -> (u32)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_le_u64
from_le_u64 :: proc(i: u64) -> (u64)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
from_le_u8
from_le_u8 :: proc(i: u8) -> (u8)SourceReturns unsigned integer i
NOTE: A byte has no endianness, so from_le_u8 exists to be complementary to from_le_*.
Inputs:
- i: The unsigned integer
Returns:
- res:
i
from_le_uint
from_le_uint :: proc(i: uint) -> (uint)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
is_power_of_two_i16
is_power_of_two_i16 :: proc(i: i16) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_i32
is_power_of_two_i32 :: proc(i: i32) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_i64
is_power_of_two_i64 :: proc(i: i64) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_i8
is_power_of_two_i8 :: proc(i: i8) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_int
is_power_of_two_int :: proc(i: int) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_u16
is_power_of_two_u16 :: proc(i: u16) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_u32
is_power_of_two_u32 :: proc(i: u32) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_u64
is_power_of_two_u64 :: proc(i: u64) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_u8
is_power_of_two_u8 :: proc(i: u8) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
is_power_of_two_uint
is_power_of_two_uint :: proc(i: uint) -> (is_pot: bool)SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
len_u16
len_u16 :: proc(x: u16) -> (n: int)Sourcereturns the minimum number of bits required to represent x
len_u32
len_u32 :: proc(x: u32) -> (n: int)Sourcereturns the minimum number of bits required to represent x
len_u64
len_u64 :: proc(x: u64) -> (n: int)Sourcereturns the minimum number of bits required to represent x
len_u8
len_u8 :: proc(x: u8) -> (int)Sourcereturns the minimum number of bits required to represent x
len_uint
len_uint :: proc(x: uint) -> (n: int)Sourcereturns the minimum number of bits required to represent x
log2
log2 :: proc(x: T) -> (res: T)SourceReturns the base-2 logarithm of an unsigned integer x
Another way to say this is that log2(x) is the position of its leading 1 bit.
NOTE: This is ill-defined for 0 as it has no 1 bits, and log2(0) will return max(T).
Inputs:
- x: The unsigned integer
Returns:
- res: The base-2 logarithm of
x
Example:
import "core:fmt"
import "core:math/bits"
log2_example :: proc() {
for i in u8(1)..=8 {
fmt.printfln("{0} ({0:4b}): {1}", i, bits.log2(i))
}
assert(bits.log2( u8(0)) == max(u8))
assert(bits.log2( u16(0)) == max(u16))
assert(bits.log2( u32(0)) == max(u32))
assert(bits.log2( u64(0)) == max(u64))
assert(bits.log2(u128(0)) == max(u128))
}Output:
1 (0001): 0
2 (0010): 1
3 (0011): 1
4 (0100): 2
5 (0101): 2
6 (0110): 2
7 (0111): 2
8 (1000): 3mul_u32
mul_u32 :: proc(x: u32, y: u32) -> (hi: u32, lo: u32)SourceMultiply two words and return the result in high and low word
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
Returns:
- hi: The result's high word
- lo: The result's low word
mul_u64
mul_u64 :: proc(x: u64, y: u64) -> (hi: u64, lo: u64)SourceMultiply two words and return the result in high and low word
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
Returns:
- hi: The result's high word
- lo: The result's low word
mul_uint
mul_uint :: proc(x: uint, y: uint) -> (hi: uint, lo: uint)SourceMultiply two words and return the result in high and low word
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
Returns:
- hi: The result's high word
- lo: The result's low word
rotate_left
rotate_left :: proc(x: uint, k: int) -> (uint)SourceReturns unsigned integer x rotated left by k bits
Can be thought of as a bit shift in which the leading bits are shifted back in on the bottom, rather than dropped.
This is equivalent to the ROL CPU instruction.
Inputs:
- x: The unsigned integer
- k: Number of bits to rotate left by
Returns:
- res:
xrotated left bykbits
rotate_left16
rotate_left16 :: proc(x: u16, k: int) -> (u16)SourceReturns unsigned integer x rotated left by k bits
Can be thought of as a bit shift in which the leading bits are shifted back in on the bottom, rather than dropped.
This is equivalent to the ROL CPU instruction.
Inputs:
- x: The unsigned integer
- k: Number of bits to rotate left by
Returns:
- res:
xrotated left bykbits
rotate_left32
rotate_left32 :: proc(x: u32, k: int) -> (u32)SourceReturns unsigned integer x rotated left by k bits
Can be thought of as a bit shift in which the leading bits are shifted back in on the bottom, rather than dropped.
This is equivalent to the ROL CPU instruction.
Inputs:
- x: The unsigned integer
- k: Number of bits to rotate left by
Returns:
- res:
xrotated left bykbits
rotate_left64
rotate_left64 :: proc(x: u64, k: int) -> (u64)SourceReturns unsigned integer x rotated left by k bits
Can be thought of as a bit shift in which the leading bits are shifted back in on the bottom, rather than dropped.
This is equivalent to the ROL CPU instruction.
Inputs:
- x: The unsigned integer
- k: Number of bits to rotate left by
Returns:
- res:
xrotated left bykbits
rotate_left8
rotate_left8 :: proc(x: u8, k: int) -> (u8)SourceReturns unsigned integer x rotated left by k bits
Can be thought of as a bit shift in which the leading bits are shifted back in on the bottom, rather than dropped.
This is equivalent to the ROL CPU instruction.
Inputs:
- x: The unsigned integer
- k: Number of bits to rotate left by
Returns:
- res:
xrotated left bykbits
Example:
import "core:fmt"
import "core:math/bits"
rotate_left8_example :: proc() {
x := u8(13)
for k in 0..<8 {
fmt.printfln("{0:8b}: {1}", bits.rotate_left8(x, k), k)
}
}Output:
00001101: 0
00011010: 1
00110100: 2
01101000: 3
11010000: 4
10100001: 5
01000011: 6
10000110: 7sub_u32
sub_u32 :: proc(x: u32, y: u32, borrow: u32) -> (diff: u32, borrow_out: u32)SourceSubtract with borrow
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- borrow: Borrow in
Returns:
- diff: The difference
- borrow_out: Borrow out
sub_u64
sub_u64 :: proc(x: u64, y: u64, borrow: u64) -> (diff: u64, borrow_out: u64)SourceSubtract with borrow
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- borrow: Borrow in
Returns:
- diff: The difference
- borrow_out: Borrow out
sub_uint
sub_uint :: proc(x: uint, y: uint, borrow: uint) -> (diff: uint, borrow_out: uint)SourceSubtract with borrow
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- borrow: Borrow in
Returns:
- diff: The difference
- borrow_out: Borrow out
to_be_u16
to_be_u16 :: proc(i: u16) -> (u16)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_be_u32
to_be_u32 :: proc(i: u32) -> (u32)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_be_u64
to_be_u64 :: proc(i: u64) -> (u64)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_be_u8
to_be_u8 :: proc(i: u8) -> (u8)SourceReturns unsigned integer i
NOTE: A byte has no endianness, so to_be_u8 exists to be complementary to to_be_*.
Inputs:
- i: The unsigned integer
Returns:
- res:
i
to_be_uint
to_be_uint :: proc(i: uint) -> (uint)SourceReturns unsigned integer i, byte-swapped if we're on a little endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_le_u16
to_le_u16 :: proc(i: u16) -> (u16)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_le_u32
to_le_u32 :: proc(i: u32) -> (u32)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_le_u64
to_le_u64 :: proc(i: u64) -> (u64)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
to_le_u8
to_le_u8 :: proc(i: u8) -> (u8)SourceReturns unsigned integer i
NOTE: A byte has no endianness, so to_le_u8 exists to be complementary to to_le_*.
Inputs:
- i: The unsigned integer
Returns:
- res:
i
to_le_uint
to_le_uint :: proc(i: uint) -> (uint)SourceReturns unsigned integer i, byte-swapped if we're on a big endian target.
Inputs:
- i: The unsigned integer
Returns:
- res:
i, optionally byte-swapped
Procedure Groups
8add
add :: proc{add_u32, add_u64, add_uint}SourceAdd with carry
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- carry: Carry in
Returns:
- sum: The sum
- carry_out: Carry out
bitfield_extract
bitfield_extract :: proc{bitfield_extract_u8, bitfield_extract_u16, bitfield_extract_u32, bitfield_extract_u64, bitfield_extract_u128, bitfield_extract_uint, bitfield_extract_i8, bitfield_extract_i16, bitfield_extract_i32, bitfield_extract_i64, bitfield_extract_i128, bitfield_extract_int}SourceExtracts bits from an integer
Inputs:
- value: Integer
- offset: Offset (counting from LSB) at which to extract
- bits: Number of bits to extract
Returns:
- res:
bitsbits starting at offsetoffset
bitfield_insert
bitfield_insert :: proc{bitfield_insert_u8, bitfield_insert_u16, bitfield_insert_u32, bitfield_insert_u64, bitfield_insert_u128, bitfield_insert_uint, bitfield_insert_i8, bitfield_insert_i16, bitfield_insert_i32, bitfield_insert_i64, bitfield_insert_i128, bitfield_insert_int}SourceInsert a subset of bits from one integer into another integer
Copies bits number of insert's lower bits to base at offset.
Inputs:
- base: Original integer to insert bits into
- insert: Integer to copy bits from
- offset: Bit offset in
baseat which to placeinsert's bits - bits: Number of bits to copy
Returns:
- res:
basewithbitsbits atoffsetreplaced withinsert's
div
div :: proc{div_u32, div_u64, div_uint}SourceDivide an unsigned integer (in two words) by a divisor
Inputs:
- hi: High word of input
- lo: Low word of input
- y: Divisor
Returns:
- quo: Quotient
- rem: Remainder
is_power_of_two
is_power_of_two :: proc{is_power_of_two_u8, is_power_of_two_i8, is_power_of_two_u16, is_power_of_two_i16, is_power_of_two_u32, is_power_of_two_i32, is_power_of_two_u64, is_power_of_two_i64, is_power_of_two_uint, is_power_of_two_int}SourceChecks whether an unsigned number is a power of two
Inputs:
- i: Unsigned number
Returns:
- is_pot:
trueifiis a power of two,falseotherwise
len
len :: proc{len_u8, len_u16, len_u32, len_u64, len_uint}Sourcereturns the minimum number of bits required to represent x
mul
mul :: proc{mul_u32, mul_u64, mul_uint}SourceMultiply two words and return the result in high and low word
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
Returns:
- hi: The result's high word
- lo: The result's low word
sub
sub :: proc{sub_u32, sub_u64, sub_uint}SourceSubtract with borrow
Inputs:
- x: The unsigned integer
- y: Another unsigned integer
- borrow: Borrow in
Returns:
- diff: The difference
- borrow_out: Borrow out