diff --git a/core/math/bits/bits.odin b/core/math/bits/bits.odin index 5e12b1f4e..5f8af593a 100644 --- a/core/math/bits/bits.odin +++ b/core/math/bits/bits.odin @@ -123,16 +123,32 @@ count_zeros32 :: proc(i: u32) -> u32 { return 32 - count_ones32(i); } count_zeros64 :: proc(i: u64) -> u64 { return 64 - count_ones64(i); } -rotate_left8 :: proc(i: u8, s: uint) -> u8 { return (i << s)|(i >> (8*size_of(u8) - s)); } -rotate_left16 :: proc(i: u16, s: uint) -> u16 { return (i << s)|(i >> (8*size_of(u16) - s)); } -rotate_left32 :: proc(i: u32, s: uint) -> u32 { return (i << s)|(i >> (8*size_of(u32) - s)); } -rotate_left64 :: proc(i: u64, s: uint) -> u64 { return (i << s)|(i >> (8*size_of(u64) - s)); } +rotate_left8 :: proc(x: u8, k: int) -> u8 { + n :: 8; + s := uint(k) & (n-1); + return x <>(n-s); +} +rotate_left16 :: proc(x: u16, k: int) -> u16 { + n :: 16; + s := uint(k) & (n-1); + return x <>(n-s); +} +rotate_left32 :: proc(x: u32, k: int) -> u32 { + n :: 32; + s := uint(k) & (n-1); + return x <>(n-s); +} +rotate_left64 :: proc(x: u64, k: int) -> u64 { + n :: 64; + s := uint(k) & (n-1); + return x <>(n-s); +} - -rotate_right8 :: proc(i: u8, s: uint) -> u8 { return (i >> s)|(i << (8*size_of(u8) - s)); } -rotate_right16 :: proc(i: u16, s: uint) -> u16 { return (i >> s)|(i << (8*size_of(u16) - s)); } -rotate_right32 :: proc(i: u32, s: uint) -> u32 { return (i >> s)|(i << (8*size_of(u32) - s)); } -rotate_right64 :: proc(i: u64, s: uint) -> u64 { return (i >> s)|(i << (8*size_of(u64) - s)); } +rotate_left :: proc(x: uint, k: int) -> uint { + n :: 8*size_of(uint); + s := uint(k) & (n-1); + return x <>(n-s); +} from_be_u8 :: proc(i: u8) -> u8 { return i; } from_be_u16 :: proc(i: u16) -> u16 { when ODIN_ENDIAN == "big" { return i; } else { return byte_swap(i); } }