- label_need_wb_2 = mono_mb_emit_branch (mb, CEE_BLE_UN);
-
- /* Don't need write barrier case */
- mono_mb_patch_branch (mb, label_no_wb);
-
- mono_mb_emit_byte (mb, CEE_RET);
-
- /* Need write barrier case */
- mono_mb_patch_branch (mb, label_need_wb_1);
- mono_mb_patch_branch (mb, label_need_wb_2);
-
- // remset_var = remembered_set;
- remset_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
- EMIT_TLS_ACCESS (mb, remset, remset_offset);
- mono_mb_emit_stloc (mb, remset_var);
-
- // next_var = rs->store_next
- next_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
- mono_mb_emit_ldloc (mb, remset_var);
- mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, store_next));
- mono_mb_emit_byte (mb, CEE_LDIND_I);
- mono_mb_emit_stloc (mb, next_var);
-
- // if (rs->store_next < rs->end_set) {
- mono_mb_emit_ldloc (mb, next_var);
- mono_mb_emit_ldloc (mb, remset_var);
- mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, end_set));
+ label_no_wb_3 = mono_mb_emit_branch (mb, CEE_BGE_UN);
+
+ // need_wb:
+ mono_mb_patch_branch (mb, label_need_wb);
+
+ // buffer = STORE_REMSET_BUFFER;
+ buffer_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
+ EMIT_TLS_ACCESS (mb, store_remset_buffer, store_remset_buffer_offset);
+ mono_mb_emit_stloc (mb, buffer_var);
+
+ // buffer_index = STORE_REMSET_BUFFER_INDEX;
+ buffer_index_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
+ EMIT_TLS_ACCESS (mb, store_remset_buffer_index, store_remset_buffer_index_offset);
+ mono_mb_emit_stloc (mb, buffer_index_var);
+
+ // if (buffer [buffer_index] == ptr) return;
+ mono_mb_emit_ldloc (mb, buffer_var);
+ mono_mb_emit_ldloc (mb, buffer_index_var);
+ g_assert (sizeof (gpointer) == 4 || sizeof (gpointer) == 8);
+ mono_mb_emit_icon (mb, sizeof (gpointer) == 4 ? 2 : 3);
+ mono_mb_emit_byte (mb, CEE_SHL);
+ mono_mb_emit_byte (mb, CEE_ADD);