diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index c095f5493c..60d2a42c01 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -25,6 +25,18 @@ M: x86.32 rs-reg EDI ; M: x86.32 stack-reg ESP ; M: x86.32 temp-reg ECX ; +M: x86.32 %mark-card + drop HEX: ffffffff [+] card-mark MOV + building get pop + rc-absolute-cell rel-cards-offset + building get push ; + +M: x86.32 %mark-deck + drop HEX: ffffffff [+] card-mark MOV + building get pop + rc-absolute-cell rel-decks-offset + building get push ; + M:: x86.32 %dispatch ( src temp -- ) ! Load jump table base. temp src HEX: ffffffff [+] LEA diff --git a/basis/cpu/x86/64/64.factor b/basis/cpu/x86/64/64.factor index c15169dd89..4674413e75 100644 --- a/basis/cpu/x86/64/64.factor +++ b/basis/cpu/x86/64/64.factor @@ -21,6 +21,20 @@ M: x86.64 ds-reg R14 ; M: x86.64 rs-reg R15 ; M: x86.64 stack-reg RSP ; +: load-cards-offset ( dst -- ) + 0 MOV rc-absolute-cell rel-cards-offset ; + +M: x86.64 %mark-card + dup load-cards-offset + [+] card-mark MOV ; + +: load-decks-offset ( dst -- ) + 0 MOV rc-absolute-cell rel-decks-offset ; + +M: x86.64 %mark-deck + dup load-cards-offset + [+] card-mark MOV ; + M:: x86.64 %dispatch ( src temp -- ) building get length :> start ! Load jump table base. diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index abe6d308b8..60d47b78ff 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -387,31 +387,21 @@ M: x86 %vm-field-ptr ( dst field -- ) : store-tagged ( dst tag -- ) tag-number OR ; -: load-cards-offset ( dst -- ) - 0 MOV rc-absolute-cell rel-cards-offset ; - -: load-decks-offset ( dst -- ) - 0 MOV rc-absolute-cell rel-decks-offset ; - M:: x86 %allot ( dst size class nursery-ptr -- ) nursery-ptr dst load-allot-ptr dst class store-header dst class store-tagged nursery-ptr size inc-allot-ptr ; +HOOK: %mark-card cpu ( card temp -- ) +HOOK: %mark-deck cpu ( card temp -- ) + :: (%write-barrier) ( src slot temp1 temp2 -- ) - ! Compute slot address. temp1 src slot [+] LEA - - ! Mark the card temp1 card-bits SHR - temp2 load-cards-offset - temp2 temp1 [+] card-mark MOV - - ! Mark the card deck + temp1 temp2 %mark-card temp1 deck-bits card-bits - SHR - temp2 load-decks-offset - temp2 temp1 [+] card-mark MOV ; + temp1 temp2 %mark-deck ; M: x86 %write-barrier ( src slot temp1 temp2 -- ) (%write-barrier) ;