Skip to content

Commit b900242

Browse files
authored
[wasm] Introduce jiterpreter control flow pass (#83247)
* Checkpoint CFG Generate fallthrough in CFG Generate branch block header partially in cfg Emit branches in CFG Checkpoint: Emit loop and exit return in CFG (broken) Fix CFG emitting function header in the wrong place Improve accuracy of cfg size estimation Remove log messages Checkpoint: Forward branches partially working Fix non-conditional branches not being added to target table Remove fallthrough * Implement backward branches via a dispatch table * Cleanup * Cleanup * Remove use of DataView since it has a hazard around heap growth Use copyWithin to implement appendBytes where possible More accurate overhead calculation
1 parent 35f3853 commit b900242

File tree

5 files changed

+414
-185
lines changed

5 files changed

+414
-185
lines changed

src/mono/mono/mini/interp/jiterpreter.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,31 @@ mono_jiterp_get_member_offset (int member) {
12811281
}
12821282
}
12831283

1284+
#define JITERP_NUMBER_MODE_U32 0
1285+
#define JITERP_NUMBER_MODE_I32 1
1286+
#define JITERP_NUMBER_MODE_F32 2
1287+
#define JITERP_NUMBER_MODE_F64 3
1288+
1289+
EMSCRIPTEN_KEEPALIVE void
1290+
mono_jiterp_write_number_unaligned (void *dest, double value, int mode) {
1291+
switch (mode) {
1292+
case JITERP_NUMBER_MODE_U32:
1293+
*((uint32_t *)dest) = (uint32_t)value;
1294+
return;
1295+
case JITERP_NUMBER_MODE_I32:
1296+
*((int32_t *)dest) = (int32_t)value;
1297+
return;
1298+
case JITERP_NUMBER_MODE_F32:
1299+
*((float *)dest) = (float)value;
1300+
return;
1301+
case JITERP_NUMBER_MODE_F64:
1302+
*((double *)dest) = value;
1303+
return;
1304+
default:
1305+
g_assert_not_reached();
1306+
}
1307+
}
1308+
12841309
// HACK: fix C4206
12851310
EMSCRIPTEN_KEEPALIVE
12861311
#endif // HOST_BROWSER

src/mono/wasm/runtime/cwraps.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ const fn_signatures: SigLine[] = [
100100
[false, "mono_jiterp_encode_leb52", "number", ["number", "number", "number"]],
101101
[false, "mono_jiterp_encode_leb64_ref", "number", ["number", "number", "number"]],
102102
[false, "mono_jiterp_encode_leb_signed_boundary", "number", ["number", "number", "number"]],
103+
[false, "mono_jiterp_write_number_unaligned", "void", ["number", "number", "number"]],
103104
[true, "mono_jiterp_type_is_byref", "number", ["number"]],
104105
[true, "mono_jiterp_get_size_of_stackval", "number", []],
105106
[true, "mono_jiterp_parse_option", "number", ["string"]],
@@ -234,6 +235,7 @@ export interface t_Cwraps {
234235
mono_jiterp_debug_count(): number;
235236
mono_jiterp_get_trace_hit_count(traceIndex: number): number;
236237
mono_jiterp_get_polling_required_address(): Int32Ptr;
238+
mono_jiterp_write_number_unaligned(destination: VoidPtr, value: number, mode: number): void;
237239
}
238240

239241
const wrapped_c_functions: t_Cwraps = <any>{};

0 commit comments

Comments
 (0)