@@ -3647,43 +3647,29 @@ export class Compiler extends DiagnosticEmitter {
3647
3647
3648
3648
// int to float
3649
3649
} else if ( fromType . isIntegerValue && toType . isFloatValue ) {
3650
-
3650
+ // Clear extra bits.
3651
+ expr = this . ensureSmallIntegerWrap ( expr , fromType ) ;
3652
+ let op : UnaryOp ;
3651
3653
// int to f32
3652
3654
if ( toType . kind == TypeKind . F32 ) {
3653
3655
if ( fromType . isLongIntegerValue ) {
3654
- expr = module . unary (
3655
- fromType . isSignedIntegerValue
3656
- ? UnaryOp . ConvertI64ToF32
3657
- : UnaryOp . ConvertU64ToF32 ,
3658
- expr
3659
- ) ;
3656
+ if ( fromType . isSignedIntegerValue ) op = UnaryOp . ConvertI64ToF32 ;
3657
+ else op = UnaryOp . ConvertU64ToF32 ;
3660
3658
} else {
3661
- expr = module . unary (
3662
- fromType . isSignedIntegerValue
3663
- ? UnaryOp . ConvertI32ToF32
3664
- : UnaryOp . ConvertU32ToF32 ,
3665
- expr
3666
- ) ;
3659
+ if ( fromType . isSignedIntegerValue ) op = UnaryOp . ConvertI32ToF32 ;
3660
+ else op = UnaryOp . ConvertU32ToF32 ;
3667
3661
}
3668
-
3669
3662
// int to f64
3670
3663
} else {
3671
3664
if ( fromType . isLongIntegerValue ) {
3672
- expr = module . unary (
3673
- fromType . isSignedIntegerValue
3674
- ? UnaryOp . ConvertI64ToF64
3675
- : UnaryOp . ConvertU64ToF64 ,
3676
- expr
3677
- ) ;
3665
+ if ( fromType . isSignedIntegerValue ) op = UnaryOp . ConvertI64ToF64 ;
3666
+ else op = UnaryOp . ConvertU64ToF64 ;
3678
3667
} else {
3679
- expr = module . unary (
3680
- fromType . isSignedIntegerValue
3681
- ? UnaryOp . ConvertI32ToF64
3682
- : UnaryOp . ConvertU32ToF64 ,
3683
- expr
3684
- ) ;
3668
+ if ( fromType . isSignedIntegerValue ) op = UnaryOp . ConvertI32ToF64 ;
3669
+ else op = UnaryOp . ConvertU32ToF64 ;
3685
3670
}
3686
3671
}
3672
+ expr = module . unary ( op , expr ) ;
3687
3673
3688
3674
// v128 to bool
3689
3675
} else if ( fromType == Type . v128 && toType . isBooleanValue ) {
0 commit comments