@@ -251,6 +251,7 @@ function getTraceImports () {
251251 [ "ldtsflda" , "ldtsflda" , getRawCwrap ( "mono_jiterp_ldtsflda" ) ] ,
252252 [ "conv_ovf" , "conv_ovf" , getRawCwrap ( "mono_jiterp_conv_ovf" ) ] ,
253253 [ "relop_fp" , "relop_fp" , getRawCwrap ( "mono_jiterp_relop_fp" ) ] ,
254+ [ "safepoint" , "safepoint" , getRawCwrap ( "mono_jiterp_auto_safepoint" ) ] ,
254255 ] ;
255256
256257 if ( instrumentedMethodNames . length > 0 ) {
@@ -504,6 +505,12 @@ function generate_wasm (
504505 "opcode" : WasmValtype . i32 ,
505506 } , WasmValtype . i32
506507 ) ;
508+ builder . defineType (
509+ "safepoint" , {
510+ "frame" : WasmValtype . i32 ,
511+ "ip" : WasmValtype . i32 ,
512+ } , WasmValtype . void
513+ ) ;
507514
508515 builder . generateTypeSection ( ) ;
509516
@@ -887,6 +894,10 @@ function generate_wasm_body (
887894 is_dead_opcode = true ;
888895 break ;
889896
897+ case MintOpcode . MINT_SAFEPOINT :
898+ append_safepoint ( builder , ip ) ;
899+ break ;
900+
890901 case MintOpcode . MINT_LDLOCA_S :
891902 // Pre-load locals for the store op
892903 builder . local ( "pLocals" ) ;
@@ -917,6 +928,13 @@ function generate_wasm_body (
917928 builder . callImport ( "value_copy" ) ;
918929 break ;
919930 }
931+ case MintOpcode . MINT_CPOBJ_VT_NOREF : {
932+ const sizeBytes = getArgU16 ( ip , 3 ) ;
933+ append_ldloc ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i32_load ) ;
934+ append_ldloc ( builder , getArgU16 ( ip , 2 ) , WasmOpcode . i32_load ) ;
935+ append_memmove_dest_src ( builder , sizeBytes ) ;
936+ break ;
937+ }
920938 case MintOpcode . MINT_LDOBJ_VT : {
921939 const size = getArgU16 ( ip , 3 ) ;
922940 append_ldloca ( builder , getArgU16 ( ip , 1 ) ) ;
@@ -932,6 +950,13 @@ function generate_wasm_body (
932950 builder . callImport ( "value_copy" ) ;
933951 break ;
934952 }
953+ case MintOpcode . MINT_STOBJ_VT_NOREF : {
954+ const sizeBytes = getArgU16 ( ip , 3 ) ;
955+ append_ldloc ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i32_load ) ;
956+ append_ldloca ( builder , getArgU16 ( ip , 2 ) ) ;
957+ append_memmove_dest_src ( builder , sizeBytes ) ;
958+ break ;
959+ }
935960
936961 case MintOpcode . MINT_STRLEN :
937962 builder . block ( ) ;
@@ -2368,16 +2393,15 @@ function emit_branch (
23682393 builder . appendU8 ( WasmOpcode . br_if ) ;
23692394 builder . appendULeb ( 0 ) ;
23702395
2371- if ( isSafepoint ) {
2372- // We set the high bit on our relative displacement so that the interpreter knows
2373- // it needs to perform a safepoint after the trace exits
2374- append_bailout ( builder , destination , BailoutReason . SafepointBranchTaken , true ) ;
2375- } else if ( displacement < 0 ) {
2396+ if ( displacement < 0 ) {
23762397 // This is a backwards branch, and right now we always bail out for those -
23772398 // so just return.
23782399 // FIXME: Why is this not a safepoint?
23792400 append_bailout ( builder , destination , BailoutReason . BackwardBranch , true ) ;
23802401 } else {
2402+ // Do a safepoint *before* changing our IP, if necessary
2403+ if ( isSafepoint )
2404+ append_safepoint ( builder , ip ) ;
23812405 // Branching is enabled, so set eip and exit the current branch block
23822406 builder . branchTargets . add ( destination ) ;
23832407 builder . ip_const ( destination ) ;
@@ -2925,6 +2949,13 @@ function append_bailout (builder: WasmBuilder, ip: MintOpcodePtr, reason: Bailou
29252949 builder . appendU8 ( WasmOpcode . return_ ) ;
29262950}
29272951
2952+ function append_safepoint ( builder : WasmBuilder , ip : MintOpcodePtr ) {
2953+ builder . local ( "frame" ) ;
2954+ // Not ip_const, because we can't pass relative IP to do_safepoint
2955+ builder . i32_const ( ip ) ;
2956+ builder . callImport ( "safepoint" ) ;
2957+ }
2958+
29282959const JITERPRETER_TRAINING = 0 ;
29292960const JITERPRETER_NOT_JITTED = 1 ;
29302961let mostRecentOptions : JiterpreterOptions | undefined = undefined ;
0 commit comments