diff --git a/basis/compiler/cfg/builder/builder.factor b/basis/compiler/cfg/builder/builder.factor index 6b685dbc1c..9ee63de7b7 100755 --- a/basis/compiler/cfg/builder/builder.factor +++ b/basis/compiler/cfg/builder/builder.factor @@ -247,7 +247,9 @@ M: #dispatch emit-node : emit-write-barrier ( -- ) phantom-pop dup >vreg fresh-object? [ drop ] [ - int-regs next-vreg ##write-barrier + int-regs next-vreg + int-regs next-vreg + ##write-barrier ] if ; : emit-intrinsic ( word -- next ) diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index 3014587edd..8edcab70c2 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -49,7 +49,7 @@ INSN: ##box-alien < ##unary temp ; ! Memory allocation INSN: ##allot < ##nullary size type tag temp ; -INSN: ##write-barrier src temp ; +INSN: ##write-barrier src card# table ; INSN: ##gc ; ! FFI @@ -62,7 +62,8 @@ GENERIC: uses-vregs ( insn -- seq ) M: ##nullary defs-vregs dst>> >vreg 1array ; M: ##unary defs-vregs dst>> >vreg 1array ; -M: ##write-barrier defs-vregs temp>> >vreg 1array ; +M: ##write-barrier defs-vregs + [ card#>> >vreg ] [ table>> >vreg ] bi 2array ; : allot-defs-vregs ( insn -- seq ) [ dst>> >vreg ] [ temp>> >vreg ] bi 2array ; diff --git a/basis/compiler/codegen/codegen.factor b/basis/compiler/codegen/codegen.factor index 70b72ae80c..fad62a97ee 100644 --- a/basis/compiler/codegen/codegen.factor +++ b/basis/compiler/codegen/codegen.factor @@ -182,7 +182,10 @@ M: ##allot generate-insn %allot ; M: ##write-barrier generate-insn - [ src>> v>operand ] [ temp>> v>operand ] bi %write-barrier ; + [ src>> v>operand ] + [ card#>> v>operand ] + [ table>> v>operand ] + tri %write-barrier ; M: ##gc generate-insn drop %gc ; diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 230cc18814..66d7b35518 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -189,7 +189,7 @@ HOOK: %box-alien cpu ( dst src temp1 temp2 -- ) ! Allocation HOOK: %allot cpu ( dst size type tag temp -- ) -HOOK: %write-barrier cpu ( src temp -- ) +HOOK: %write-barrier cpu ( src card# table -- ) ! GC check HOOK: %gc cpu ( -- ) diff --git a/basis/cpu/x86/allot/allot.factor b/basis/cpu/x86/allot/allot.factor index 58b6730694..425479dc89 100644 --- a/basis/cpu/x86/allot/allot.factor +++ b/basis/cpu/x86/allot/allot.factor @@ -7,17 +7,18 @@ compiler.constants compiler.cfg.templates compiler.cfg.builder compiler.codegen compiler.codegen.fixup ; IN: cpu.x86.allot -M:: x86 %write-barrier ( src temp -- ) +M:: x86 %write-barrier ( src card# table -- ) #! Mark the card pointed to by vreg. ! Mark the card - src card-bits SHR - "cards_offset" f temp %alien-global - temp src [+] card-mark MOV + card# src MOV + card# card-bits SHR + "cards_offset" f table %alien-global + table card# [+] card-mark MOV ! Mark the card deck - src deck-bits card-bits - SHR - "decks_offset" f temp %alien-global - temp src [+] card-mark MOV ; + card# deck-bits card-bits - SHR + "decks_offset" f table %alien-global + table card# [+] card-mark MOV ; : load-zone-ptr ( reg -- ) #! Load pointer to start of zone array