diff options
Diffstat (limited to 'pcompact_rmark.a')
-rw-r--r-- | pcompact_rmark.a | 158 |
1 files changed, 148 insertions, 10 deletions
diff --git a/pcompact_rmark.a b/pcompact_rmark.a index 3ce30ee..f6c8671 100644 --- a/pcompact_rmark.a +++ b/pcompact_rmark.a @@ -368,8 +368,8 @@ rmark_selector_node_1: ble rmark_small_tuple_or_record rmark_large_tuple_or_record: - lwz o2,8-NODE_POINTER_OFFSET(a1) - sub o2,o2,d6 + lwz a2,8-NODE_POINTER_OFFSET(a1) + sub o2,a2,d6 srwi d2,o2,5 lbzx g1,o4,d2 @@ -377,15 +377,49 @@ rmark_large_tuple_or_record: rlwnm. r0,g1,g2,24,24 bne rmark_hnf_1 + if NEW_DESCRIPTORS + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + andc o1,o1,o3 + lea g1,__indirection + if ! LINUX + lwzx d0,rtoc,d0 + endif + stbx o1,o4,o0 + + lhz d0,4(d0) + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + + cmplwi 0,d0,8 + blt rmark_tuple_or_record_selector_node_2 + beq rmark_tuple_selector_node_2 + +rmark_tuple_or_record_selector_node_g2: + addi a0,a2,-12 + lwzx a0,a0,d0 + stw a0,0(a3) + stw a0,4-NODE_POINTER_OFFSET(d2) + b rmark_node_d1 + +rmark_tuple_selector_node_2: + lwz a0,0(a2) + stw a0,0(a3) + stw a0,4-NODE_POINTER_OFFSET(d2) + b rmark_node_d1 + else rmark_small_tuple_or_record: - if LINUX + if LINUX lwz g1,-8(d0) mflr r0 - else + else lha g1,-6(d0) mflr r0 lwzx g1,rtoc,g1 - endif + endif andc o1,o1,o3 lwz g1,4(g1) @@ -409,6 +443,7 @@ rmark_small_tuple_or_record: stw a0,4-NODE_POINTER_OFFSET(d2) stw g1,0-NODE_POINTER_OFFSET(d2) b rmark_node_d1 + endif rmark_record_selector_node_1: srwi d2,o2,5 @@ -426,7 +461,45 @@ rmark_record_selector_node_1: lha g1,-2(d2) cmplwi 0,g1,258 ble rmark_small_tuple_or_record + + if NEW_DESCRIPTORS + lwz a2,8-NODE_POINTER_OFFSET(a1) + sub o2,a2,d6 + + srwi d2,o2,5 + lbzx g1,o4,d2 + rlwinm g2,o2,32-2,29,31 + rlwnm. r0,g1,g2,24,24 + bne rmark_hnf_1 + +rmark_small_tuple_or_record: + if LINUX + lwz d0,-8(d0) + else + lha d0,-6(d0) + endif + andc o1,o1,o3 + lea g1,__indirection + if ! LINUX + lwzx d0,rtoc,d0 + endif + stbx o1,o4,o0 + + lhz d0,4(d0) + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + + cmplwi 0,d0,8 + bgt rmark_tuple_or_record_selector_node_g2 + +rmark_tuple_or_record_selector_node_2: + lwzx a0,a1,d0 + stw a0,0(a3) + stw a0,4-NODE_POINTER_OFFSET(d2) + b rmark_node_d1 + else b rmark_large_tuple_or_record + endif rmark_strict_record_selector_node_1: rlwnm. r0,g1,g2,24,24 @@ -440,8 +513,8 @@ rmark_strict_record_selector_node_1: cmplwi 0,g1,258 ble rmark_select_from_small_record - lwz o2,8-NODE_POINTER_OFFSET(a1) - sub o2,o2,d6 + lwz a2,8-NODE_POINTER_OFFSET(a1) + sub o2,a2,d6 srwi d2,o2,5 lbzx g1,o4,d2 @@ -452,17 +525,52 @@ rmark_strict_record_selector_node_1: rmark_select_from_small_record: if LINUX lwz g1,-8(d0) - mflr r0 else lha g1,-6(d0) + endif + if ! NEW_DESCRIPTORS + if LINUX + mflr r0 + else mflr r0 lwzx g1,rtoc,g1 + endif endif subi a0,a0,4 - + if NEW_DESCRIPTORS + if ! LINUX + lwzx g1,rtoc,g1 + endif + endif cmplw a0,d1 bgt rmark_selector_pointer_not_reversed + if NEW_DESCRIPTORS + lhz d0,4(g1) + cmplwi 0,d0,8 + ble rmark_strict_record_selector_node_2 + addi d0,d0,-12 + lwzx d0,a2,d0 + b rmark_strict_record_selector_node_3 +rmark_strict_record_selector_node_2: + lwzx d0,a1,d0 +rmark_strict_record_selector_node_3: + stw d0,4-NODE_POINTER_OFFSET(a0) + + lhz d0,6(g1) + tst d0 + beq rmark_strict_record_selector_node_5 + cmplwi 0,d0,8 + ble rmark_strict_record_selector_node_4 + mr a1,a2 + addi d0,d0,-12 +rmark_strict_record_selector_node_4: + lwzx d0,a1,d0 + stw d0,8-NODE_POINTER_OFFSET(a0) +rmark_strict_record_selector_node_5: + + lwz d0,-4(g1) + else stw d0,0(a0) lwz g1,4(g1) @@ -478,19 +586,48 @@ rmark_select_from_small_record: mtlr r0 lwz d0,0(a0) + endif + addi a3,a3,1 stw a3,0(a0) stw d0,-1(a3) b rmark_next_node rmark_selector_pointer_not_reversed: + if NEW_DESCRIPTORS + lhz d0,4(g1) + cmplwi 0,d0,8 + ble rmark_strict_record_selector_node_6 + addi d0,d0,-12 + lwzx d0,a2,d0 + b rmark_strict_record_selector_node_7 +rmark_strict_record_selector_node_6: + lwzx d0,a1,d0 +rmark_strict_record_selector_node_7: + stw d0,4-NODE_POINTER_OFFSET(a0) + + lhz d0,6(g1) + tst d0 + beq rmark_strict_record_selector_node_9 + cmplwi 0,d0,8 + ble rmark_strict_record_selector_node_8 + mr a1,a2 + addi d0,d0,-12 +rmark_strict_record_selector_node_8: + lwzx d0,a1,d0 + stw d0,8-NODE_POINTER_OFFSET(a0) +rmark_strict_record_selector_node_9: + + lwz d0,-4(g1) + stw d0,0-NODE_POINTER_OFFSET(a0) + else lwz g1,4(g1) mtctr g1 stwu r0,-4(sp) bctrl mtlr r0 - + endif b rmark_next_node rmark_reverse_and_mark_next_node: @@ -510,6 +647,7 @@ rmark_next_node: cmplwi a0,1 bgt rmark_node +rmark_next_node_: blr rmark_lazy_node: |