Skip to content

Commit b0bcb23

Browse files
committed
Fix signed cast to 128bit integer
1 parent d2eafd8 commit b0bcb23

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

example/std_example.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ fn main() {
5353
assert_eq!(0b100010000000000000000000000000000u128 >> 10, 0b10001000000000000000000u128);
5454
assert_eq!(0xFEDCBA987654321123456789ABCDEFu128 >> 64, 0xFEDCBA98765432u128);
5555
assert_eq!(0xFEDCBA987654321123456789ABCDEFu128 as i128 >> 64, 0xFEDCBA98765432i128);
56-
assert_eq!(353985398u128 * 932490u128, 330087843781020u128);
56+
57+
let tmp = 353985398u128;
58+
assert_eq!(tmp * 932490u128, 330087843781020u128);
59+
60+
let tmp = -0x1234_5678_9ABC_DEF0i64;
61+
assert_eq!(tmp as i128, -0x1234_5678_9ABC_DEF0i128);
5762

5863
// Check that all u/i128 <-> float casts work correctly.
5964
let houndred_u128 = 100u128;

src/cast.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,19 @@ pub fn clif_intcast(
1313

1414
// extend
1515
(_, types::I128) => {
16-
let wider = if from == types::I64 {
16+
let lo = if from == types::I64 {
1717
val
1818
} else if signed {
1919
fx.bcx.ins().sextend(types::I64, val)
2020
} else {
2121
fx.bcx.ins().uextend(types::I64, val)
2222
};
23-
let zero = fx.bcx.ins().iconst(types::I64, 0);
24-
fx.bcx.ins().iconcat(wider, zero)
23+
let hi = if signed {
24+
fx.bcx.ins().sshr_imm(lo, 63)
25+
} else {
26+
fx.bcx.ins().iconst(types::I64, 0)
27+
};
28+
fx.bcx.ins().iconcat(lo, hi)
2529
}
2630
(_, _) if to.wider_or_equal(from) => {
2731
if signed {

0 commit comments

Comments
 (0)