Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions src/coreclr/vm/arm64/asmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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]
Expand All @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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):
Expand All @@ -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


Expand Down
45 changes: 27 additions & 18 deletions src/coreclr/vm/arm64/asmhelpers.asm
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down