diff options
author | John van Groningen | 2005-11-21 11:14:02 +0000 |
---|---|---|
committer | John van Groningen | 2005-11-21 11:14:02 +0000 |
commit | 7cce946384986ad74368d7f8499e1591aca52a08 (patch) | |
tree | e3a4b095d5c4eaf3a08094826731b218b7d84026 /pmark.a | |
parent | move mark pass of compacting collector to separate file(s), (diff) |
change descriptors for selectors, copying garbage collector copies
records without pointers to end of heap
Diffstat (limited to 'pmark.a')
-rw-r--r-- | pmark.a | 336 |
1 files changed, 289 insertions, 47 deletions
@@ -54,6 +54,8 @@ _end_mark_cafs: bl _mark_stack_nodes +continue_mark_after_pmark: + lea a0,lazy_array_list lwz a0,0(a0) @@ -238,6 +240,18 @@ no_extra_word: lwz o2,0(o1) addi o2,o2,1 endif + + if MEASURE_GC + lea o0,total_gc_bytes_lo + lwz g1,0(o0) + addc g1,g1,d4 + stw g1,0(o0) + lea o0,total_gc_bytes_hi + lwz g1,0(o0) + addze g1,g1 + stw g1,0(o0) + endif + lea o0,flags lwz o0,0(o0) andi. r0,o0,2 @@ -664,24 +678,68 @@ _mark_selector_node_1: _large_tuple_or_record: lwz d1,8(a1) - sub d1,d1,d6 - rlwinm o0,d1,32-5,5,29 + sub o1,d1,d6 + rlwinm o0,o1,32-5,5,29 lwzx g1,o4,o0 - rlwinm d1,d1,32-2,27,31 - rlwnm. r0,g1,d1,0,0 + rlwinm o1,o1,32-2,27,31 + rlwnm. r0,g1,o1,0,0 bne _mark_node3 + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + lea g1,__indirection + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz d0,4(d0) + cmplwi 0,d0,8 + blt _mark_tuple_selector_node_1 + mr a1,d1 + beq _mark_tuple_selector_node_2 + addi d0,d0,-12 + lwzx a0,a1,d0 + stw a0,4-NODE_POINTER_OFFSET(d2) + b _mark_node + +_mark_tuple_selector_node_2: + lwz a0,0-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(d2) + b _mark_node + endif + _small_tuple_or_record: - if LINUX - lwz g1,-8(d0) + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + lea g1,__indirection + stw g1,-4-NODE_POINTER_OFFSET(a0) + if ! LINUX + lwzx d0,rtoc,d0 + endif + subi d2,a0,4 + lhz d0,4(d0) +_mark_tuple_selector_node_1: + lwzx a0,a1,d0 + stw a0,4-NODE_POINTER_OFFSET(d2) else + if LINUX + lwz g1,-8(d0) + else lha g1,-6(d0) - endif + endif subi d2,a0,4 - if LINUX - else + if ! LINUX lwzx g1,rtoc,g1 - endif + endif mr a0,a1 lwz g1,4(g1) @@ -694,9 +752,10 @@ _small_tuple_or_record: lea g1,__indirection stw a0,4-NODE_POINTER_OFFSET(d2) stw g1,0-NODE_POINTER_OFFSET(d2) + endif if REMOVE_INDIRECTION_LISTS - addi g2,d2,4 - b __mark_node + addi g2,d2,4 + b __mark_node else b _mark_node endif @@ -714,7 +773,40 @@ _mark_record_selector_node_1: lhz g1,-2(d2) cmplwi 0,g1,258 ble _small_tuple_or_record + + if NEW_DESCRIPTORS + lwz d1,8-NODE_POINTER_OFFSET(a1) + + sub o1,d1,d6 + rlwinm o0,o1,32-5,5,29 + lwzx g1,o4,o0 + rlwinm o1,o1,32-2,27,31 + rlwnm. r0,g1,o1,0,0 + bne _mark_node3 + + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + lea g1,__indirection + stw g1,-4-NODE_POINTER_OFFSET(a0) + mr d2,a0 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz d0,4(d0) + cmplwi 0,d0,8 + ble _mark_record_selector_node_2 + mr a1,d1 + addi d0,d0,-12 +_mark_record_selector_node_2: + lwzx a0,a1,d0 + stw a0,0-NODE_POINTER_OFFSET(d2) + b _mark_node + else b _large_tuple_or_record + endif _mark_strict_record_selector_node_1: rlwnm. r0,o1,d1,0,0 @@ -731,24 +823,59 @@ _no_mark_strict_record_selector_node_1: lwz d1,8-NODE_POINTER_OFFSET(a1) - sub d1,d1,d6 - rlwinm o0,d1,32-5,5,29 + sub o1,d1,d6 + rlwinm o0,o1,32-5,5,29 lwzx g1,o4,o0 - rlwinm d1,d1,32-2,27,31 - rlwnm. r0,g1,d1,0,0 + rlwinm o1,o1,32-2,27,31 + rlwnm. r0,g1,o1,0,0 bne _mark_node3 - + _select_from_small_record: - if LINUX - lwz g1,-8(d0) + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + subi a0,a0,4 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz g1,4(d0) + cmplwi 0,g1,8 + ble _mark_strict_record_selector_node_2 + addi g1,g1,-12 + lwzx g1,d1,g1 + b _mark_strict_record_selector_node_3 +_mark_strict_record_selector_node_2: + lwzx g1,a1,g1 +_mark_strict_record_selector_node_3: + stw g1,4-NODE_POINTER_OFFSET(a0) + + lhz g1,6(d0) + tst g1 + beq _mark_strict_record_selector_node_5 + cmplwi 0,g1,8 + ble _mark_strict_record_selector_node_4 + mr a1,d1 + addi g1,g1,-12 +_mark_strict_record_selector_node_4: + lwzx g1,a1,g1 + stw g1,8-NODE_POINTER_OFFSET(a0) +_mark_strict_record_selector_node_5: + + lwz d0,-4(d0) + stw d0,0-NODE_POINTER_OFFSET(a0) else + if LINUX + lwz g1,-8(d0) + else lha g1,-6(d0) - endif + endif subi a0,a0,4 - if LINUX - else + if ! LINUX lwzx g1,rtoc,g1 - endif + endif lwz g1,4(g1) mtctr g1 @@ -756,6 +883,7 @@ _select_from_small_record: stwu r0,-4(sp) bctrl mtlr r0 + endif b _mark_next_node @@ -875,8 +1003,7 @@ __small_tuple_or_record: lha g1,-6(d0) endif mr d2,a0 - if LINUX - else + if ! LINUX lwzx g1,rtoc,g1 endif mr a0,a1 @@ -1384,7 +1511,7 @@ _end_set_lazy_array_bits: mflr d1 stw a2,-8(sp) - addi a2,a0,12--NODE_POINTER_OFFSET + addi a2,a0,12-NODE_POINTER_OFFSET stw a4,-4(sp) slwi d2,d2,2 @@ -1637,9 +1764,9 @@ __mark__selector__node__1: cmplwi 0,g1,2 ble __small__tuple__or__record -__large__tuple__or__record: - lwz o2,8-NODE_POINTER_OFFSET(a1) - sub o2,o2,d6 +__large__tuple__or__record: + lwz d1,8-NODE_POINTER_OFFSET(a1) + sub o2,d1,d6 rlwinm d2,o2,32-5,5,29 lwzx g1,o4,d2 @@ -1649,17 +1776,61 @@ __large__tuple__or__record: and. r0,g2,g1 bne- __mark__selector__1 + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + lea g1,__indirection + stw g1,-4-NODE_POINTER_OFFSET(a0) + mr d2,a0 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz d0,4(d0) + cmplwi 0,d0,8 + blt __mark_tuple_selector_node_1 + mr a1,d1 + beq __mark_tuple_selector_node_2 + addi d0,d0,-12 + lwzx a0,a1,d0 + stw a0,0(d2) + b __mark__node + +__mark_tuple_selector_node_2: + lwz a0,0(a1) + stw a0,0(d2) + b __mark__node + endif + __small__tuple__or__record: - if LINUX - lwz g1,-8(d0) + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + lea g1,__indirection + stw g1,-4-NODE_POINTER_OFFSET(a0) + mr d2,a0 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz d0,4(d0) +__mark_tuple_selector_node_1: + lwzx a0,a1,d0 + stw a0,0(d2) else + if LINUX + lwz g1,-8(d0) + else lha g1,-6(d0) - endif + endif subi d2,a0,4 - if LINUX - else + if ! LINUX lwzx g1,rtoc,g1 - endif + endif mr a0,a1 lwz g1,4(g1) @@ -1672,6 +1843,7 @@ __small__tuple__or__record: lea g1,__indirection stw a0,4-NODE_POINTER_OFFSET(d2) stw g1,0-NODE_POINTER_OFFSET(d2) + endif b __mark__node __mark__record__selector__node__1: @@ -1686,8 +1858,45 @@ __mark__record__selector__node__1: lhz g1,-2(d2) cmplwi 0,g1,258 + if NEW_DESCRIPTORS + ble __small__record + + lwz d1,8-NODE_POINTER_OFFSET(a1) + sub o2,d1,d6 + + rlwinm d2,o2,32-5,5,29 + lwzx g1,o4,d2 + rlwinm o2,o2,32-2,27,31 + srw g2,g3,o2 + + and. r0,g2,g1 + bne- __mark__selector__1 + +__small__record: + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + lea g1,__indirection + stw g1,-4-NODE_POINTER_OFFSET(a0) + mr d2,a0 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz d0,4(d0) + cmplwi 0,d0,8 + ble __mark_record_selector_node_2 + mr a1,d1 + addi d0,d0,-12 +__mark_record_selector_node_2: + lwzx a0,a1,d0 + stw a0,0(d2) + b __mark__node + else ble __small__tuple__or__record b __large__tuple__or__record + endif __mark__strict__record__selector__node__1: rlwnm. r0,g1,o2,0,0 @@ -1701,26 +1910,61 @@ __mark__strict__record__selector__node__1: cmplwi 0,g1,258 ble __select__from__small__record - lwz o2,8-NODE_POINTER_OFFSET(a1) - sub o2,o2,d6 + lwz d1,8-NODE_POINTER_OFFSET(a1) + sub o2,d1,d6 rlwinm d2,o2,32-5,5,29 lwzx g1,o4,d2 rlwinm o2,o2,32-2,27,31 rlwnm. r0,g1,o2,0,0 bne- __mark__selector__1 - + __select__from__small__record: - if LINUX - lwz g1,-8(d0) + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + subi a0,a0,4 + if ! LINUX + lwzx d0,rtoc,d0 + endif + lhz g1,4(d0) + cmplwi 0,g1,8 + ble __mark_strict_record_selector_node_2 + addi g1,g1,-12 + lwzx g1,d1,g1 + b __mark_strict_record_selector_node_3 +__mark_strict_record_selector_node_2: + lwzx g1,a1,g1 +__mark_strict_record_selector_node_3: + stw g1,4-NODE_POINTER_OFFSET(a0) + + lhz g1,6(d0) + tst g1 + beq __mark_strict_record_selector_node_5 + cmplwi 0,g1,8 + ble __mark_strict_record_selector_node_4 + mr a1,d1 + addi g1,g1,-12 +__mark_strict_record_selector_node_4: + lwzx g1,a1,g1 + stw g1,8-NODE_POINTER_OFFSET(a0) +__mark_strict_record_selector_node_5: + + lwz d0,-4(d0) + stw d0,0-NODE_POINTER_OFFSET(a0) else + if LINUX + lwz g1,-8(d0) + else lha g1,-6(d0) - endif + endif subi a0,a0,4 - if LINUX - else + if ! LINUX lwzx g1,rtoc,g1 - endif + endif lwz g1,4(g1) mtctr g1 @@ -1728,7 +1972,7 @@ __select__from__small__record: stwu r0,-4(sp) bctrl mtlr r0 - + endif b __mark__node __mark__indirection__node: @@ -2114,8 +2358,6 @@ __mark__ab__record__array: mullw d1,a1,g1 badd d4,d1 badd d1,d0 - -; to do add n b elements to d4 slwi d1,d1,2 add d1,a0,d1 |