From c8fb917abc650ba2e56325b2805574c0b94473a6 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Fri, 27 Mar 2026 08:56:01 -0700 Subject: [PATCH 1/3] Basic implementation of int to float casts without overflow checks --- src/coreclr/jit/codegenwasm.cpp | 35 +++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index a6e5a5af6a2648..7ec059b9e8f7d1 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -1097,11 +1097,42 @@ void CodeGen::genFloatToIntCast(GenTree* tree) // // Notes: // Handles casts from TYP_INT/TYP_LONG to TYP_FLOAT/TYP_DOUBLE. -// Currently not implemented (NYI_WASM). // void CodeGen::genIntToFloatCast(GenTree* tree) { - NYI_WASM("genIntToFloatCast"); + assert(tree->OperIs(GT_CAST)); + assert(!tree->gtOverflow()); + + GenTreeCast * cast = tree->AsCast(); + var_types toType = tree->TypeGet(); + var_types fromType = genActualType(cast->CastOp()->TypeGet()); + instruction ins = INS_none; + + genConsumeOperands(cast); + + switch (PackTypes(toType, fromType)) + { + case PackTypes(TYP_FLOAT, TYP_INT): + ins = cast->IsUnsigned() ? INS_f32_convert_u_i32 : INS_f32_convert_s_i32; + break; + case PackTypes(TYP_DOUBLE, TYP_INT): + ins = cast->IsUnsigned() ? INS_f64_convert_u_i32 : INS_f64_convert_s_i32; + break; + case PackTypes(TYP_FLOAT, TYP_LONG): + ins = cast->IsUnsigned() ? INS_f32_convert_u_i64 : INS_f32_convert_s_i64; + break; + case PackTypes(TYP_DOUBLE, TYP_LONG): + ins = cast->IsUnsigned() ? INS_f64_convert_u_i64 : INS_f64_convert_s_i64; + break; + default: + unreached(); + } + + if (ins != INS_none) + { + GetEmitter()->emitIns(ins); + } + WasmProduceReg(tree); } //------------------------------------------------------------------------ From 07b9f19e753be9d22afac01f08a3ca7c0616e335 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Fri, 27 Mar 2026 09:17:10 -0700 Subject: [PATCH 2/3] Cleanup --- src/coreclr/jit/codegenwasm.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 7ec059b9e8f7d1..472494f205bede 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -1128,10 +1128,7 @@ void CodeGen::genIntToFloatCast(GenTree* tree) unreached(); } - if (ins != INS_none) - { - GetEmitter()->emitIns(ins); - } + GetEmitter()->emitIns(ins); WasmProduceReg(tree); } From 1fbac744ee14d6f9f2bc3ebac920142c036db5f8 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Fri, 27 Mar 2026 09:19:46 -0700 Subject: [PATCH 3/3] jit-format --- src/coreclr/jit/codegenwasm.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 472494f205bede..6f9a7e9ede7945 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -1103,10 +1103,10 @@ void CodeGen::genIntToFloatCast(GenTree* tree) assert(tree->OperIs(GT_CAST)); assert(!tree->gtOverflow()); - GenTreeCast * cast = tree->AsCast(); - var_types toType = tree->TypeGet(); - var_types fromType = genActualType(cast->CastOp()->TypeGet()); - instruction ins = INS_none; + GenTreeCast* cast = tree->AsCast(); + var_types toType = tree->TypeGet(); + var_types fromType = genActualType(cast->CastOp()->TypeGet()); + instruction ins = INS_none; genConsumeOperands(cast);