@@ -3647,43 +3647,29 @@ export class Compiler extends DiagnosticEmitter {
36473647
36483648 // int to float
36493649 } else if ( fromType . isIntegerValue && toType . isFloatValue ) {
3650-
3650+ // Clear extra bits.
3651+ expr = this . ensureSmallIntegerWrap ( expr , fromType ) ;
3652+ let op : UnaryOp ;
36513653 // int to f32
36523654 if ( toType . kind == TypeKind . F32 ) {
36533655 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 ;
36603658 } 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 ;
36673661 }
3668-
36693662 // int to f64
36703663 } else {
36713664 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 ;
36783667 } 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 ;
36853670 }
36863671 }
3672+ expr = module . unary ( op , expr ) ;
36873673
36883674 // v128 to bool
36893675 } else if ( fromType == Type . v128 && toType . isBooleanValue ) {
0 commit comments