cpu.x86: eliminate 2 instructions form write barrier on x86-32

db4
Slava Pestov 2009-10-15 22:07:03 -05:00
parent 8a7547ef1b
commit 6641c530d5
3 changed files with 31 additions and 15 deletions

View File

@ -25,6 +25,18 @@ M: x86.32 rs-reg EDI ;
M: x86.32 stack-reg ESP ; M: x86.32 stack-reg ESP ;
M: x86.32 temp-reg ECX ; M: x86.32 temp-reg ECX ;
M: x86.32 %mark-card
drop HEX: ffffffff [+] card-mark <byte> MOV
building get pop
rc-absolute-cell rel-cards-offset
building get push ;
M: x86.32 %mark-deck
drop HEX: ffffffff [+] card-mark <byte> MOV
building get pop
rc-absolute-cell rel-decks-offset
building get push ;
M:: x86.32 %dispatch ( src temp -- ) M:: x86.32 %dispatch ( src temp -- )
! Load jump table base. ! Load jump table base.
temp src HEX: ffffffff [+] LEA temp src HEX: ffffffff [+] LEA

View File

@ -21,6 +21,20 @@ M: x86.64 ds-reg R14 ;
M: x86.64 rs-reg R15 ; M: x86.64 rs-reg R15 ;
M: x86.64 stack-reg RSP ; 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 <byte> MOV ;
: load-decks-offset ( dst -- )
0 MOV rc-absolute-cell rel-decks-offset ;
M: x86.64 %mark-deck
dup load-cards-offset
[+] card-mark <byte> MOV ;
M:: x86.64 %dispatch ( src temp -- ) M:: x86.64 %dispatch ( src temp -- )
building get length :> start building get length :> start
! Load jump table base. ! Load jump table base.

View File

@ -387,31 +387,21 @@ M: x86 %vm-field-ptr ( dst field -- )
: store-tagged ( dst tag -- ) : store-tagged ( dst tag -- )
tag-number OR ; 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 -- ) M:: x86 %allot ( dst size class nursery-ptr -- )
nursery-ptr dst load-allot-ptr nursery-ptr dst load-allot-ptr
dst class store-header dst class store-header
dst class store-tagged dst class store-tagged
nursery-ptr size inc-allot-ptr ; nursery-ptr size inc-allot-ptr ;
HOOK: %mark-card cpu ( card temp -- )
HOOK: %mark-deck cpu ( card temp -- )
:: (%write-barrier) ( src slot temp1 temp2 -- ) :: (%write-barrier) ( src slot temp1 temp2 -- )
! Compute slot address.
temp1 src slot [+] LEA temp1 src slot [+] LEA
! Mark the card
temp1 card-bits SHR temp1 card-bits SHR
temp2 load-cards-offset temp1 temp2 %mark-card
temp2 temp1 [+] card-mark <byte> MOV
! Mark the card deck
temp1 deck-bits card-bits - SHR temp1 deck-bits card-bits - SHR
temp2 load-decks-offset temp1 temp2 %mark-deck ;
temp2 temp1 [+] card-mark <byte> MOV ;
M: x86 %write-barrier ( src slot temp1 temp2 -- ) (%write-barrier) ; M: x86 %write-barrier ( src slot temp1 temp2 -- ) (%write-barrier) ;