未验证 提交 d8b177e2 编写于 作者: A Alexander Soldatov 提交者: GitHub

[ARM64] Add g_GCShadowEnd to JIT_WriteBarrier_Table (#91342)

* [ARM64] Add g_GCShadowEnd to JIT_WriteBarrier_Table

This change moves address of g_GCShadowEnd to JIT_WriteBarrier_Table like
others variables used in Write Barrier.

This fix simmilar to RISC-V one https://github.com/dotnet/runtime/pull/90036

* [ARM64] Move GCShadow vars to the end of the wbs block

* Update src/coreclr/vm/arm64/asmhelpers.asm

---------
Co-authored-by: NJan Kotas <jkotas@microsoft.com>
上级 f4702002
......@@ -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
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册