summaryrefslogtreecommitdiff
path: root/macho/pmark.a
diff options
context:
space:
mode:
authorJohn van Groningen2006-04-06 11:43:02 +0000
committerJohn van Groningen2006-04-06 11:43:02 +0000
commit4486c2a8ce6347b82c57369a099a6130887066bb (patch)
tree7917d76340c4873c0fb9312f6a98eeeac8265f71 /macho/pmark.a
parentuse cr in cmp instructions (diff)
use new descriptors for Mach-O
Diffstat (limited to 'macho/pmark.a')
-rw-r--r--macho/pmark.a501
1 files changed, 416 insertions, 85 deletions
diff --git a/macho/pmark.a b/macho/pmark.a
index 3d62968..9f2c0a5 100644
--- a/macho/pmark.a
+++ b/macho/pmark.a
@@ -41,7 +41,6 @@ _mark_cafs_lp:
addi a2,d0,4
slwi d0,d1,2
add a4,a2,d0
-
bl _mark_stack_nodes
addic. d0,o5,0
@@ -55,6 +54,8 @@ _end_mark_cafs:
bl _mark_stack_nodes
+continue_mark_after_pmark:
+
lea a0,lazy_array_list
lwz a0,0(a0)
@@ -239,6 +240,7 @@ no_extra_word:
lwz o2,0(o1)
addi o2,o2,1
.endif
+
lea o0,_flags
lwz o0,0(o0)
andi. r0,o0,2
@@ -275,6 +277,7 @@ no_extra_word:
.else
bl _ew_print_string
.endif
+
.if MACOSX
lwz sp,0(sp)
lwzu o4,0(sp)
@@ -399,31 +402,44 @@ _end_scan:
.text
+; __TEXT.mark_gc:
.globl _mark_stack_nodes
; a0,a1,a2,a3,a4
; d0,d1,d2,d3,d4,d5,d6,d7
; o0,o1,o2,o3,o4,o5
; g0,g1,g2
+
; g3 = 0x80000000
-; a5 not used, __cycle__in__spine
-; a6 not used, hp
+; o3 = bit mask
+; o4 = heap_vector
+; o5 = next_caf
+; d3,d5 = used during pointer reversal
+; d4 = n_marked_words
+; d6 = heap_p3
+; d7 = 32*heap_size_33
+
+; a2 = pointer to next node on stack
+; a3 = end_stack
+; a4 = end_vector
+
+; a5 = not used, __cycle__in__spine
+; a6 = not used, hp
_mark_stack_nodes:
cmpw a4,a2
beqlr
+_mark_stack_nodes_:
lwz a0,0(a2)
addi a2,a2,4
sub d1,a0,d6
- .if SHARE_CHAR_INT
- cmplw d1,d7
+ cmplw d1,d7
bge- _mark_stack_nodes
- .endif
-
+
rlwinm o0,d1,32-5,5,29
lwzx o1,o4,o0
rlwinm d1,d1,32-2,27,31
@@ -444,6 +460,43 @@ _mark_next_node:
li g0,0
stwu g0,-4(sp)
+ b _mark_arguments
+
+_mark_hnf_2:
+ cmplwi cr0,o3,4
+ bor o1,o3
+ stwx o1,o4,o0
+ bge+ fits_in_word_6
+
+ baddi o0,4
+ lwzx o1,o4,o0
+ bor o1,g3
+ stwx o1,o4,o0
+
+fits_in_word_6:
+ baddi d4,3
+
+_mark_record_2_c:
+ lwz o0,4-NODE_POINTER_OFFSET(a0)
+ cmplw 0,sp,a3
+
+ stwu o0,-4(sp)
+ blt __mark_using_reversal
+
+_mark_node2:
+ lwz a0,0-NODE_POINTER_OFFSET(a0)
+
+_mark_node:
+ sub d1,a0,d6
+ cmplw d1,d7
+ bge _mark_next_node
+
+ rlwinm o0,d1,32-5,5,29
+ lwzx o1,o4,o0
+ rlwinm d1,d1,32-2,27,31
+ rlwnm. r0,o1,d1,0,0
+ bne _mark_next_node
+
_mark_arguments:
lwz d0,0-NODE_POINTER_OFFSET(a0)
@@ -599,14 +652,45 @@ _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
+ lwz d0,-8(d0)
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ subi d2,a0,4
+ lhz d0,4(d0)
+ cmplwi cr0,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 NEW_DESCRIPTORS
+ lwz d0,-8(d0)
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ 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
lwz g1,-8(d0)
subi d2,a0,4
mr a0,a1
@@ -621,9 +705,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
@@ -641,7 +726,33 @@ _mark_record_selector_node_1:
lhz g1,-2(d2)
cmplwi cr0,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
+
+ lwz d0,-8(d0)
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ lhz d0,4(d0)
+ cmplwi cr0,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
@@ -658,14 +769,43 @@ _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 NEW_DESCRIPTORS
+ lwz d0,-8(d0)
+ subi a0,a0,4
+ lhz g1,4(d0)
+ cmplwi cr0,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 cr0,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
lwz g1,-8(d0)
subi a0,a0,4
lwz g1,4(g1)
@@ -675,23 +815,22 @@ _select_from_small_record:
stwu r0,-4(sp)
bctrl
mtlr r0
+ .endif
b _mark_next_node
_mark_indirection_node:
-
.if REMOVE_INDIRECTION_LISTS
mr g2,a0
__mark_indirection_node:
mr a0,a1
__mark_node:
sub d1,a0,d6
- .if SHARE_CHAR_INT
cmplw d1,d7
bge- __mark_next_node
- .endif
+
rlwinm o0,d1,32-5,5,29
lwzx o1,o4,o0
rlwinm d1,d1,32-2,27,31
@@ -789,16 +928,8 @@ __large_tuple_or_record:
bne __mark_node3
__small_tuple_or_record:
- .if LINUX
lwz g1,-8(d0)
- .else
- lha g1,-6(d0)
- .endif
mr d2,a0
- .if LINUX
- .else
- lwzx g1,rtoc,g1
- .endif
mr a0,a1
lwz g1,4(g1)
@@ -892,60 +1023,21 @@ __end_indirection_list5:
b _no_mark_strict_record_selector_node_1
.endif
-
-
-
-
-
-
_mark_node3:
mr a0,a1
b _mark_node
-_mark_hnf_2:
- cmplwi cr0,o3,4
- bor o1,o3
- stwx o1,o4,o0
- bge+ fits_in_word_6
-
- baddi o0,4
- lwzx o1,o4,o0
- bor o1,g3
- stwx o1,o4,o0
-
-fits_in_word_6:
- baddi d4,3
-
-_mark_record_2_c:
- lwz o0,4-NODE_POINTER_OFFSET(a0)
- cmplw 0,sp,a3
-
- stwu o0,-4(sp)
- blt __mark_using_reversal
-
-_mark_node2:
- lwz a0,0-NODE_POINTER_OFFSET(a0)
-
-_mark_node:
- sub d1,a0,d6
- .if SHARE_CHAR_INT
- cmplw d1,d7
- bge- _mark_next_node
- .endif
-
- rlwinm o0,d1,32-5,5,29
- lwzx o1,o4,o0
- rlwinm d1,d1,32-2,27,31
- rlwnm. r0,o1,d1,0,0
- beq _mark_arguments
-
_mark_next_node:
lwz a0,0(sp)
baddi sp,4
tst a0
bne _mark_node
- b _mark_stack_nodes
+ cmpw a4,a2
+ bne _mark_stack_nodes_
+
+_end_mark_nodes:
+ blr
_mark_lazy_node:
tst d2
@@ -1200,15 +1292,167 @@ _mark_string_or_array:
_mark_array:
lwz d1,8-NODE_POINTER_OFFSET(a0)
tst d1
- beq __mark_array_using_reversal
+ beq _mark_lazy_array
lhz d0,-2(d1)
tst d0
beq _mark_strict_basic_array
lhz d1,-2+2(d1)
+ tst d1
beq _mark_b_record_array
+ cmplw 0,sp,a3
+ blt __mark_array_using_reversal
+
+ subi d3,d0,256
+ lwz d2,4-NODE_POINTER_OFFSET(a0)
+
+ cmplw 0,d1,d3
+ bor o1,o3
+
+ stwx o1,o4,o0
+ baddi d4,1
+
+ mullw d0,d2,d3
+
+ beq _mark_lazy_or_a_record_array
+
+_mark_ab_record_array:
+ baddi d0,3-1
+
+ badd d4,d0
+ slwi d0,d0,2
+
+ badd d0,a0
+
+ sub d0,d0,d6
+ rlwinm d0,d0,32-5,5,29
+
+ cmplw 0,o0,d0
+ bge _end_set_ab_array_bits
+
+ baddi o0,4
+ cmplw 0,o0,d0
+ bge _last_ab_array_bits
+
+_mark_ab_array_lp:
+ stwx g3,o4,o0
+ baddi o0,4
+ cmplw 0,o0,d0
+ blt _mark_ab_array_lp
+
+_last_ab_array_bits:
+ lwzx o1,o4,o0
+ bor o1,g3
+ stwx o1,o4,o0
+
+_end_set_ab_array_bits:
+ mflr o1
+ stw a2,-8(sp)
+
+ stw a4,-4(sp)
+ slwi d3,d3,2
+
+ addi a2,a0,12-NODE_POINTER_OFFSET
+ stw d3,-20(sp)
+
+ slwi d1,d1,2
+ stw d1,-16(sp)
+
+ cmplwi cr0,d2,0
+
+ stw o1,-12(sp)
+ subi sp,sp,28
+
+ beq _mark_ab_array_0
+
+_mark_ab_array:
+ lwz d1,12(sp)
+ stw d2,4(sp)
+ stw a2,0(sp)
+
+ add a4,a2,d1
+ bl _mark_stack_nodes
+
+ lwz d2,4(sp)
+ lwz a2,0(sp)
+ subic. d2,d2,1
+ lwz d3,8(sp)
+ add a2,a2,d3
+ bne _mark_ab_array
+
+_mark_ab_array_0:
+ lwz o1,16(sp)
+ baddi sp,28
+
+ lwz a2,-8(sp)
+ mtlr o1
+ lwz a4,-4(sp)
+ b _mark_next_node
+
+_mark_lazy_array:
+ cmplw 0,sp,a3
+ blt __mark_array_using_reversal
+
+ lwz d0,4-NODE_POINTER_OFFSET(a0)
+ bor o1,o3
+
+ stwx o1,o4,o0
+ baddi d4,1
+
+_mark_lazy_or_a_record_array:
+ mr d2,d0
+ baddi d0,3-1
+
+ badd d4,d0
+ slwi d0,d0,2
+
+ badd d0,a0
+
+ sub d0,d0,d6
+ rlwinm d0,d0,32-5,5,29
+
+ cmplw 0,o0,d0
+ bge _end_set_lazy_array_bits
+
+ baddi o0,4
+ cmplw 0,o0,d0
+ bge _last_lazy_array_bits
+
+_mark_lazy_array_lp:
+ stwx g3,o4,o0
+ baddi o0,4
+ cmplw 0,o0,d0
+ blt _mark_lazy_array_lp
+
+_last_lazy_array_bits:
+ lwzx o1,o4,o0
+ bor o1,g3
+ stwx o1,o4,o0
+
+_end_set_lazy_array_bits:
+ mflr d1
+ stw a2,-8(sp)
+
+ addi a2,a0,12-NODE_POINTER_OFFSET
+ stw a4,-4(sp)
+
+ slwi d2,d2,2
+ stwu d1,-12(sp)
+
+ add a4,a2,d2
+ bl _mark_stack_nodes
+
+ lwz d1,0(sp)
+ baddi sp,12
+
+ lwz a2,-8(sp)
+ mtlr d1
+
+ lwz a4,-4(sp)
+ b _mark_next_node
+
__mark_array_using_reversal:
li d3,0
stwu d3,-4(sp)
@@ -1444,9 +1688,9 @@ __mark__selector__node__1:
cmplwi cr0,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
@@ -1456,7 +1700,38 @@ __large__tuple__or__record:
and. r0,g2,g1
bne- __mark__selector__1
+ .if NEW_DESCRIPTORS
+ lwz d0,-8(d0)
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ lhz d0,4(d0)
+ cmplwi cr0,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 NEW_DESCRIPTORS
+ lwz d0,-8(d0)
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ lhz d0,4(d0)
+__mark_tuple_selector_node_1:
+ lwzx a0,a1,d0
+ stw a0,0(d2)
+ .else
lwz g1,-8(d0)
subi d2,a0,4
mr a0,a1
@@ -1471,6 +1746,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:
@@ -1485,8 +1761,38 @@ __mark__record__selector__node__1:
lhz g1,-2(d2)
cmplwi cr0,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:
+ lwz d0,-8(d0)
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ lhz d0,4(d0)
+ cmplwi cr0,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
@@ -1500,16 +1806,45 @@ __mark__strict__record__selector__node__1:
cmplwi cr0,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 NEW_DESCRIPTORS
+ lwz d0,-8(d0)
+ subi a0,a0,4
+ lhz g1,4(d0)
+ cmplwi cr0,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 cr0,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
lwz g1,-8(d0)
subi a0,a0,4
lwz g1,4(g1)
@@ -1519,7 +1854,7 @@ __select__from__small__record:
stwu r0,-4(sp)
bctrl
mtlr r0
-
+ .endif
b __mark__node
__mark__indirection__node:
@@ -1554,10 +1889,8 @@ __mark__record__2__c:
__mark__node:
sub d1,a0,d6
- .if SHARE_CHAR_INT
cmplw d1,d7
bge- __mark__next__node__after__static
- .endif
rlwinm o0,d1,32-5,5,29
lwzx o1,o4,o0
@@ -1905,8 +2238,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