summaryrefslogtreecommitdiff
path: root/pmark.a
diff options
context:
space:
mode:
authorJohn van Groningen2005-11-21 11:14:02 +0000
committerJohn van Groningen2005-11-21 11:14:02 +0000
commit7cce946384986ad74368d7f8499e1591aca52a08 (patch)
treee3a4b095d5c4eaf3a08094826731b218b7d84026 /pmark.a
parentmove 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.a336
1 files changed, 289 insertions, 47 deletions
diff --git a/pmark.a b/pmark.a
index 99272cd..37adba6 100644
--- a/pmark.a
+++ b/pmark.a
@@ -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