Skip to content

Instantly share code, notes, and snippets.

@dotbmp
Last active January 18, 2024 15:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dotbmp/1d80d679ac93a5785b716aee163d7056 to your computer and use it in GitHub Desktop.
Save dotbmp/1d80d679ac93a5785b716aee163d7056 to your computer and use it in GitHub Desktop.
Sign-Extension and Zero-Extension Helpers in Odin
package bit_extension
import "core:intrinsics"
sign_extend :: #force_inline proc "contextless" ($D: typeid, src: $S) -> D where
intrinsics.type_is_integer(D) &&
intrinsics.type_is_integer(S) &&
size_of(D) >= size_of(S)
{
when size_of(S) == size_of(i128) {
when size_of(D) == size_of(i128) do return D(src)
}
else when size_of(S) == size_of(i64) {
when size_of(D) == size_of(i128) do return D(i128(i64(src)))
else when size_of(D) == size_of(i64) do return D(src)
}
else when size_of(S) == size_of(i32) {
when size_of(D) == size_of(i128) do return D(i128(i32(src)))
else when size_of(D) == size_of(i64) do return D(i64(i32(src)))
else when size_of(D) == size_of(i32) do return D(src)
}
else when size_of(S) == size_of(i16) {
when size_of(D) == size_of(i128) do return D(i128(i16(src)))
else when size_of(D) == size_of(i64) do return D(i64(i16(src)))
else when size_of(D) == size_of(i32) do return D(i32(i16(src)))
else when size_of(D) == size_of(i16) do return D(src)
}
else when size_of(S) == size_of(i8) {
when size_of(D) == size_of(i128) do return D(i128(i8(src)))
else when size_of(D) == size_of(i64) do return D(i64(i8(src)))
else when size_of(D) == size_of(i32) do return D(i32(i8(src)))
else when size_of(D) == size_of(i16) do return D(i16(i8(src)))
else when size_of(D) == size_of(i8) do return D(src)
}
else do #panic("unreachable")
}
zero_extend :: #force_inline proc "contextless" ($D: typeid, src: $S) -> D where
intrinsics.type_is_integer(D) &&
intrinsics.type_is_integer(S) &&
size_of(D) >= size_of(S)
{
when size_of(S) == size_of(u128) {
when size_of(D) == size_of(u128) do return D(src)
}
else when size_of(S) == size_of(u64) {
when size_of(D) == size_of(u128) do return D(u128(u64(src)))
else when size_of(D) == size_of(u64) do return D(src)
}
else when size_of(S) == size_of(u32) {
when size_of(D) == size_of(u128) do return D(u128(u32(src)))
else when size_of(D) == size_of(u64) do return D(u64(u32(src)))
else when size_of(D) == size_of(u32) do return D(src)
}
else when size_of(S) == size_of(u16) {
when size_of(D) == size_of(u128) do return D(u128(u16(src)))
else when size_of(D) == size_of(u64) do return D(u64(u16(src)))
else when size_of(D) == size_of(u32) do return D(u32(u16(src)))
else when size_of(D) == size_of(u16) do return D(src)
}
else when size_of(S) == size_of(u8) {
when size_of(D) == size_of(u128) do return D(u128(u8(src)))
else when size_of(D) == size_of(u64) do return D(u64(u8(src)))
else when size_of(D) == size_of(u32) do return D(u32(u8(src)))
else when size_of(D) == size_of(u16) do return D(u16(u8(src)))
else when size_of(D) == size_of(u8) do return D(src)
}
else do #panic("unreachable")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment