mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 21:39:07 +00:00
intcast cases (probably wrong)
This commit is contained in:
parent
b648507a91
commit
eaef21f7d4
2 changed files with 71 additions and 2 deletions
|
@ -2900,8 +2900,40 @@ impl<
|
||||||
source: IntWidth,
|
source: IntWidth,
|
||||||
target: IntWidth,
|
target: IntWidth,
|
||||||
) {
|
) {
|
||||||
|
use IntWidth::*;
|
||||||
|
|
||||||
let buf = &mut self.buf;
|
let buf = &mut self.buf;
|
||||||
|
|
||||||
|
match (source, target) {
|
||||||
|
(U128, U64) => {
|
||||||
|
let dst_reg = self.storage_manager.claim_general_reg(buf, dst);
|
||||||
|
|
||||||
|
let (offset, _size) = self.storage_manager.stack_offset_and_size(src);
|
||||||
|
|
||||||
|
ASM::mov_reg64_base32(buf, dst_reg, offset + 8);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(U64, U128) => {
|
||||||
|
let src_reg = self.storage_manager.load_to_general_reg(buf, src);
|
||||||
|
|
||||||
|
let base_offset = self.storage_manager.claim_stack_area(&dst, 16);
|
||||||
|
|
||||||
|
let tmp = Symbol::DEV_TMP;
|
||||||
|
let tmp_reg = self.storage_manager.claim_general_reg(buf, &tmp);
|
||||||
|
|
||||||
|
// move a zero into the lower 8 bytes
|
||||||
|
ASM::mov_reg64_imm64(buf, tmp_reg, 0x0);
|
||||||
|
ASM::mov_base32_reg64(buf, base_offset, tmp_reg);
|
||||||
|
|
||||||
|
ASM::mov_base32_reg64(buf, base_offset + 8, src_reg);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
let dst_reg = self.storage_manager.claim_general_reg(buf, dst);
|
let dst_reg = self.storage_manager.claim_general_reg(buf, dst);
|
||||||
let src_reg = self.storage_manager.load_to_general_reg(buf, src);
|
let src_reg = self.storage_manager.load_to_general_reg(buf, src);
|
||||||
|
|
||||||
|
@ -2911,7 +2943,44 @@ impl<
|
||||||
_ => todo!("int cast from {source:?} to {target:?}"),
|
_ => todo!("int cast from {source:?} to {target:?}"),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
todo!("int cast from {source:?} to {target:?}");
|
match (source, target) {
|
||||||
|
(U8, U16 | U32 | U64) => {
|
||||||
|
// zero out the register
|
||||||
|
ASM::xor_reg64_reg64_reg64(buf, dst_reg, dst_reg, dst_reg);
|
||||||
|
|
||||||
|
// move the 8-bit integer
|
||||||
|
ASM::mov_reg_reg(buf, RegisterWidth::W8, dst_reg, src_reg);
|
||||||
|
}
|
||||||
|
(U16, U32 | U64) => {
|
||||||
|
// zero out the register
|
||||||
|
ASM::xor_reg64_reg64_reg64(buf, dst_reg, dst_reg, dst_reg);
|
||||||
|
|
||||||
|
// move the 16-bit integer
|
||||||
|
ASM::mov_reg_reg(buf, RegisterWidth::W16, dst_reg, src_reg);
|
||||||
|
}
|
||||||
|
(U32, U64) => {
|
||||||
|
// zero out the register
|
||||||
|
ASM::xor_reg64_reg64_reg64(buf, dst_reg, dst_reg, dst_reg);
|
||||||
|
|
||||||
|
// move the 32-bit integer
|
||||||
|
ASM::mov_reg_reg(buf, RegisterWidth::W32, dst_reg, src_reg);
|
||||||
|
}
|
||||||
|
(U64, U32) => {
|
||||||
|
// move as a 32-bit integer (leaving any other bits behind)
|
||||||
|
ASM::mov_reg_reg(buf, RegisterWidth::W32, dst_reg, src_reg);
|
||||||
|
}
|
||||||
|
(U64, U16) => {
|
||||||
|
// move as a 16-bit integer (leaving any other bits behind)
|
||||||
|
ASM::mov_reg_reg(buf, RegisterWidth::W16, dst_reg, src_reg);
|
||||||
|
}
|
||||||
|
(U64, I8) => {
|
||||||
|
//
|
||||||
|
ASM::mov_reg_reg(buf, RegisterWidth::W8, dst_reg, src_reg);
|
||||||
|
|
||||||
|
// TODO extension?
|
||||||
|
}
|
||||||
|
_ => todo!("int cast from {source:?} to {target:?}"),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3684,7 +3684,7 @@ fn to_float_f64() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
|
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
|
||||||
// https://github.com/roc-lang/roc/issues/2696
|
// https://github.com/roc-lang/roc/issues/2696
|
||||||
fn upcast_of_int_is_zext() {
|
fn upcast_of_int_is_zext() {
|
||||||
assert_evals_to!(
|
assert_evals_to!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue