/// Cast i32 to u32 (same size, no instruction needed).
fn i32ToU32(x: i32) -> u32 {
    return x as u32;
}

/// Cast u8 to i32 (zero-extend).
fn u8ToI32(x: u8) -> i32 {
    return x as i32;
}

/// Cast i8 to i32 (sign-extend).
fn i8ToI32(x: i8) -> i32 {
    return x as i32;
}

/// Cast u16 to i32 (zero-extend).
fn u16ToI32(x: u16) -> i32 {
    return x as i32;
}

/// Cast i16 to i32 (sign-extend).
fn i16ToI32(x: i16) -> i32 {
    return x as i32;
}

/// Cast i32 to i8 (narrowing, no instruction).
fn i32ToI8(x: i32) -> i8 {
    return x as i8;
}

/// Cast u8 to u32 (zero-extend to unsigned target).
fn u8ToU32(x: u8) -> u32 {
    return x as u32;
}

/// Cast i32 to i16 (narrowing).
fn i32ToI16(x: i32) -> i16 {
    return x as i16;
}

/// Cast pointer types (same size, no instruction).
fn ptrCast(x: *u8) -> *i32 {
    return x as *i32;
}
