diff --git a/src/coreclr/vm/arm64/asmhelpers.S b/src/coreclr/vm/arm64/asmhelpers.S index cdbe24ec427a98..e12db2efcddbac 100644 --- a/src/coreclr/vm/arm64/asmhelpers.S +++ b/src/coreclr/vm/arm64/asmhelpers.S @@ -208,7 +208,7 @@ LEAF_END ThePreStubPatch, _TEXT WRITE_BARRIER_ENTRY JIT_UpdateWriteBarrierState PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -16 - // x0-x7 will contain intended new state + // x0-x7, x10 will contain intended new state // x8 will preserve skipEphemeralCheck // x12 will be used for pointers @@ -223,33 +223,36 @@ WRITE_BARRIER_ENTRY JIT_UpdateWriteBarrierState ldr x1, [x12] #endif -#ifdef WRITE_BARRIER_CHECK - PREPARE_EXTERNAL_VAR g_GCShadow, x12 - ldr x2, [x12] -#endif - #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP PREPARE_EXTERNAL_VAR g_sw_ww_table, x12 - ldr x3, [x12] + ldr x2, [x12] #endif PREPARE_EXTERNAL_VAR g_ephemeral_low, x12 - ldr x4, [x12] + ldr x3, [x12] PREPARE_EXTERNAL_VAR g_ephemeral_high, x12 - ldr x5, [x12] + ldr x4, [x12] cbz x8, LOCAL_LABEL(EphemeralCheckEnabled) - movz x4, #0 - movn x5, #0 + movz x3, #0 + movn x4, #0 LOCAL_LABEL(EphemeralCheckEnabled): PREPARE_EXTERNAL_VAR g_lowest_address, x12 - ldr x6, [x12] + ldr x5, [x12] PREPARE_EXTERNAL_VAR g_highest_address, x12 + ldr x6, [x12] + +#ifdef WRITE_BARRIER_CHECK + PREPARE_EXTERNAL_VAR g_GCShadow, x12 ldr x7, [x12] + PREPARE_EXTERNAL_VAR g_GCShadowEnd, x12 + ldr x10, [x12] +#endif + // Update wbs state PREPARE_EXTERNAL_VAR JIT_WriteBarrier_Table_Loc, x12 ldr x12, [x12] @@ -258,7 +261,11 @@ LOCAL_LABEL(EphemeralCheckEnabled): stp x0, x1, [x12], 16 stp x2, x3, [x12], 16 stp x4, x5, [x12], 16 - stp x6, x7, [x12], 16 + str x6, [x12], 8 +#ifdef WRITE_BARRIER_CHECK + stp x7, x10, [x12], 16 +#endif + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 16 EPILOG_RETURN @@ -367,8 +374,7 @@ WRITE_BARRIER_ENTRY JIT_WriteBarrier add x12, x13, x12 // if (pShadow >= g_GCShadowEnd) goto end - PREPARE_EXTERNAL_VAR g_GCShadowEnd, x13 - ldr x13, [x13] + ldr x13, LOCAL_LABEL(wbs_GCShadowEnd) cmp x12, x13 bhs LOCAL_LABEL(ShadowUpdateEnd) @@ -460,8 +466,6 @@ LOCAL_LABEL(wbs_card_table): .quad 0 LOCAL_LABEL(wbs_card_bundle_table): .quad 0 -LOCAL_LABEL(wbs_GCShadow): - .quad 0 LOCAL_LABEL(wbs_sw_ww_table): .quad 0 LOCAL_LABEL(wbs_ephemeral_low): @@ -472,6 +476,12 @@ LOCAL_LABEL(wbs_lowest_address): .quad 0 LOCAL_LABEL(wbs_highest_address): .quad 0 +#ifdef WRITE_BARRIER_CHECK +LOCAL_LABEL(wbs_GCShadow): + .quad 0 +LOCAL_LABEL(wbs_GCShadowEnd): + .quad 0 +#endif WRITE_BARRIER_END JIT_WriteBarrier_Table diff --git a/src/coreclr/vm/arm64/asmhelpers.asm b/src/coreclr/vm/arm64/asmhelpers.asm index d2222c8e10895f..d72d3ad7863e12 100644 --- a/src/coreclr/vm/arm64/asmhelpers.asm +++ b/src/coreclr/vm/arm64/asmhelpers.asm @@ -278,7 +278,7 @@ ThePreStubPatchLabel WRITE_BARRIER_ENTRY JIT_UpdateWriteBarrierState PROLOG_SAVE_REG_PAIR fp, lr, #-16! - ; x0-x7 will contain intended new state + ; x0-x7, x10 will contain intended new state ; x8 will preserve skipEphemeralCheck ; x12 will be used for pointers @@ -293,33 +293,36 @@ ThePreStubPatchLabel ldr x1, [x12, g_card_bundle_table] #endif -#ifdef WRITE_BARRIER_CHECK - adrp x12, $g_GCShadow - ldr x2, [x12, $g_GCShadow] -#endif - #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP adrp x12, g_sw_ww_table - ldr x3, [x12, g_sw_ww_table] + ldr x2, [x12, g_sw_ww_table] #endif adrp x12, g_ephemeral_low - ldr x4, [x12, g_ephemeral_low] + ldr x3, [x12, g_ephemeral_low] adrp x12, g_ephemeral_high - ldr x5, [x12, g_ephemeral_high] + ldr x4, [x12, g_ephemeral_high] ; Check skipEphemeralCheck cbz x8, EphemeralCheckEnabled - movz x4, #0 - movn x5, #0 + movz x3, #0 + movn x4, #0 EphemeralCheckEnabled adrp x12, g_lowest_address - ldr x6, [x12, g_lowest_address] + ldr x5, [x12, g_lowest_address] adrp x12, g_highest_address - ldr x7, [x12, g_highest_address] + ldr x6, [x12, g_highest_address] + +#ifdef WRITE_BARRIER_CHECK + adrp x12, $g_GCShadow + ldr x7, [x12, $g_GCShadow] + + adrp x12, $g_GCShadowEnd + ldr x10, [x12, $g_GCShadowEnd] +#endif ; Update wbs state adrp x12, JIT_WriteBarrier_Table_Loc @@ -328,7 +331,10 @@ EphemeralCheckEnabled stp x0, x1, [x12], 16 stp x2, x3, [x12], 16 stp x4, x5, [x12], 16 - stp x6, x7, [x12], 16 + str x6, [x12], 8 +#ifdef WRITE_BARRIER_CHECK + stp x7, x10, [x12], 16 +#endif EPILOG_RESTORE_REG_PAIR fp, lr, #16! EPILOG_RETURN @@ -343,8 +349,6 @@ wbs_card_table DCQ 0 wbs_card_bundle_table DCQ 0 -wbs_GCShadow - DCQ 0 wbs_sw_ww_table DCQ 0 wbs_ephemeral_low @@ -355,6 +359,12 @@ wbs_lowest_address DCQ 0 wbs_highest_address DCQ 0 +#ifdef WRITE_BARRIER_CHECK +wbs_GCShadow + DCQ 0 +wbs_GCShadowEnd + DCQ 0 +#endif WRITE_BARRIER_END JIT_WriteBarrier_Table ; void JIT_ByRefWriteBarrier @@ -433,8 +443,7 @@ NotInHeap add x12, x13, x12 ; if (pShadow >= $g_GCShadowEnd) goto end - adrp x13, $g_GCShadowEnd - ldr x13, [x13, $g_GCShadowEnd] + ldr x13, wbs_GCShadowEnd cmp x12, x13 bhs ShadowUpdateEnd