diff options
-rw-r--r-- | pcompact_rmark.a | 158 | ||||
-rw-r--r-- | pcompact_rmarkr.a | 128 | ||||
-rw-r--r-- | pcopy.a | 511 | ||||
-rw-r--r-- | pmark.a | 336 | ||||
-rw-r--r-- | pstartup.a | 552 |
5 files changed, 1521 insertions, 164 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: diff --git a/pcompact_rmarkr.a b/pcompact_rmarkr.a index 3efb806..ce75520 100644 --- a/pcompact_rmarkr.a +++ b/pcompact_rmarkr.a @@ -157,24 +157,56 @@ rmarkr_selector_node_1: ble rmarkr_small_tuple_or_record rmarkr_large_tuple_or_record: - lwz d1,8-NODE_POINTER_OFFSET(a1) + lwz a2,8-NODE_POINTER_OFFSET(a1) - sub o2,d1,d6 + 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 rmarkr_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 rmarkr_tuple_or_record_selector_node_2 + beq rmarkr_tuple_selector_node_2 + +rmarkr_tuple_or_record_selector_node_g2: + addi a0,a2,-12 + lwzx a0,a0,d0 + stw a0,4-NODE_POINTER_OFFSET(d2) + b rmarkr_node + +rmarkr_tuple_selector_node_2: + lwz a0,0(a2) + stw a0,4-NODE_POINTER_OFFSET(d2) + b rmarkr_node + else rmarkr_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) @@ -191,6 +223,7 @@ rmarkr_small_tuple_or_record: stw a0,4-NODE_POINTER_OFFSET(d2) stw g1,0-NODE_POINTER_OFFSET(d2) b rmarkr_node + endif rmarkr_record_selector_node_1: srwi d2,o2,5 @@ -208,7 +241,44 @@ rmarkr_record_selector_node_1: lha g1,-2(d2) cmplwi 0,g1,258 ble rmarkr_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 rmarkr_hnf_1 + +rmarkr_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 rmarkr_tuple_or_record_selector_node_g2 + +rmarkr_tuple_or_record_selector_node_2: + lwzx a0,a1,d0 + stw a0,4-NODE_POINTER_OFFSET(d2) + b rmarkr_node + else b rmarkr_large_tuple_or_record + endif rmarkr_strict_record_selector_node_1: rlwnm. r0,g1,g2,24,24 @@ -222,8 +292,8 @@ rmarkr_strict_record_selector_node_1: cmplwi 0,g1,258 ble rmarkr_select_from_small_record - lwz d1,8-NODE_POINTER_OFFSET(a1) - sub o2,d1,d6 + lwz a2,8-NODE_POINTER_OFFSET(a1) + sub o2,a2,d6 srwi d2,o2,5 lbzx g1,o4,d2 @@ -232,14 +302,50 @@ rmarkr_strict_record_selector_node_1: bne rmarkr_hnf_1 rmarkr_select_from_small_record: - if LINUX + if NEW_DESCRIPTORS + if LINUX lwz g1,-8(d0) - mflr r0 + else + lha g1,-6(d0) + endif + subi a0,a0,4 + if ! LINUX + lwzx g1,rtoc,g1 + endif + lhz d0,4(g1) + cmplwi 0,d0,8 + ble rmarkr_strict_record_selector_node_2 + addi d0,d0,-12 + lwzx d0,a2,d0 + b rmarkr_strict_record_selector_node_3 +rmarkr_strict_record_selector_node_2: + lwzx d0,a1,d0 +rmarkr_strict_record_selector_node_3: + stw d0,4-NODE_POINTER_OFFSET(a0) + + lhz d0,6(g1) + tst d0 + beq rmarkr_strict_record_selector_node_5 + cmplwi 0,d0,8 + ble rmarkr_strict_record_selector_node_4 + mr a1,a2 + addi d0,d0,-12 +rmarkr_strict_record_selector_node_4: + lwzx d0,a1,d0 + stw d0,8-NODE_POINTER_OFFSET(a0) +rmarkr_strict_record_selector_node_5: + + lwz d0,-4(g1) + stw d0,0-NODE_POINTER_OFFSET(a0) else + if LINUX + lwz g1,-8(d0) + mflr r0 + else lha g1,-6(d0) mflr r0 lwzx g1,rtoc,g1 - endif + endif subi a0,a0,4 lwz g1,4(g1) @@ -247,7 +353,7 @@ rmarkr_select_from_small_record: stwu r0,-4(sp) blrl mtlr r0 - + endif b rmarkr_next_node rmarkr_indirection_node: @@ -121,18 +121,26 @@ copy_record_1: subic. d5,d5,1 bgt copy_lp2 - + if 1 + b copy_node_arity1 + else beq- copy_node_arity1 baddi a2,8 b copy_lp1 + endif copy_record_arguments_1: + if 1 + li d5,0 + b copy_lp2 + else cmpwi d5,0 li d5,0 bne copy_lp2 baddi a2,4 b copy_lp1 + endif copy_record_arguments_3: if COPIED_VECTOR @@ -146,11 +154,14 @@ copy_record_arguments_3: cmpwi 6,,d1,0 endif baddi d5,2+1 + if 1 + subi d6,d1,1 + else beq 6,copy_record_arguments_3b subic. d6,d1,1 beq copy_record_arguments_3abb - + endif slwi d5,d5,2 add d4,a2,d5 @@ -164,6 +175,7 @@ copy_record_arguments_3: mr a2,d4 b copy_lp1 + if 0 copy_record_arguments_3abb: subi d5,d5,1 slwi d6,d5,2 @@ -177,6 +189,7 @@ copy_record_arguments_3b: slwi d5,d5,2 add a2,a2,d5 b copy_lp1 + endif if COPIED_VECTOR record_node_without_arguments_part: @@ -307,13 +320,22 @@ in_hnf_2: lhz d2,-2(d0) beq copy_arity_0_node2 cmplwi 6,d2,256 - if NODE_POINTER_OFFSET==0 + if 0 + if NODE_POINTER_OFFSET==0 stw a6,-4(a2) - endif + endif stw d0,0(a6) + endif bge 6,copy_record_2 + if 1 + if NODE_POINTER_OFFSET==0 + stw a6,-4(a2) + endif + stw d0,0(a6) + endif subic. d2,d2,2 + lwz o0,4-NODE_POINTER_OFFSET(a1) addi a0,a6,1+NODE_POINTER_OFFSET @@ -510,8 +532,277 @@ already_copied_2_: bge 5,copy_lp2 blr -; to do: copy strict basic records to end of heap + if 1 +copy_record_2: + subic. d2,d2,258 + + lhz o1,-2+2(d0) + + blt copy_record_node2_1 + bgt copy_record_node2_3 + + cmpwi o1,0 + beq copy_real_or_file_2 + + if NODE_POINTER_OFFSET==0 + stw a6,-4(a2) + endif + stw d0,0(a6) + lwz o0,4-NODE_POINTER_OFFSET(a1) + + addi a0,a6,1+NODE_POINTER_OFFSET + stw a0,0-NODE_POINTER_OFFSET(a1) + + lwz o1,8-NODE_POINTER_OFFSET(a1) + + stw o0,4(a6) + if NODE_POINTER_OFFSET==0 + stw o1,8(a6) + baddi a6,12 + else + stwu o1,8(a6) + stw a6,-4(a2) + baddi a6,4 + endif + bge 5,copy_lp2 + blr + +copy_record_node2_1: + cmpwi o1,0 + + lwz o0,4-NODE_POINTER_OFFSET(a1) + + beq copy_record_node2_1_b + + if NODE_POINTER_OFFSET==0 + stw a6,-4(a2) + endif + stw d0,0(a6) + + addi a0,a6,1+NODE_POINTER_OFFSET + stw a0,0-NODE_POINTER_OFFSET(a1) + + stw o0,4-NODE_POINTER_OFFSET(a6) + baddi a6,8 + if NODE_POINTER_OFFSET + stw a6,-4(a2) + endif + bge 5,copy_lp2 + blr + +copy_record_node2_1_b: + if NODE_POINTER_OFFSET==0 + stwu d0,-8(o4) + addi d2,o4,1 + stw d2,0-NODE_POINTER_OFFSET(a1) + stw o0,4(o4) + stw o4,-4(a2) + else + stw o4,-4(a2) + addi d2,o4,1 + stw d2,0-NODE_POINTER_OFFSET(a1) + stw o0,-4(o4) + stwu d0,-8(o4) + endif + bge 5,copy_lp2 + blr + +copy_record_node2_3: + cmplwi o1,1 + + lwz o0,4-NODE_POINTER_OFFSET(a1) + + ble copy_record_node2_3_ab_or_b + + if NODE_POINTER_OFFSET==0 + stw a6,-4(a2) + endif + stw d0,0(a6) + + addi a0,a6,1+NODE_POINTER_OFFSET + stw a0,0-NODE_POINTER_OFFSET(a1) + + lwz a0,8-NODE_POINTER_OFFSET(a1) + stw o0,4(a6) + + if 1 + lwz o1,0-NODE_POINTER_OFFSET(a0) + + andi. r0,o1,1 + bne record_arguments_already_copied_2 + else + if COPIED_VECTOR + lea a1,heap_copied_vector + sub d0,a0,a3 + lwz a1,0(a1) + + tstmbit a1,d0,d1,o0,o1,o2,3 + bne record_arguments_already_copied_2 + + li o0,128 + srw o0,o0,o2 + or o1,o1,o0 + stbx o1,a1,d1 + endif + endif + + if NODE_POINTER_OFFSET==0 + addi a1,a6,12 + stw a1,8(a6) + else + addi a1,a6,12+NODE_POINTER_OFFSET + stwu a1,8(a6) + stw a6,-4(a2) + endif + if 0 + lwz o1,0-NODE_POINTER_OFFSET(a0) + endif + addi a1,a1,1 + stw a1,0-NODE_POINTER_OFFSET(a0) + if NODE_POINTER_OFFSET==0 + stwu o1,12(a6) + else + stwu o1,4(a6) + endif + +cp_record_arg_lp2: + if NODE_POINTER_OFFSET + lwz o1,4-NODE_POINTER_OFFSET(a0) + baddi a0,4 + else + lwzu o1,4(a0) + endif + subic. d2,d2,1 + stwu o1,4(a6) + bgt cp_record_arg_lp2 + + addi a6,a6,4 + + bge 5,copy_lp2 + blr + + if COPIED_VECTOR +record_arguments_already_copied_2: + lwz o0,0-NODE_POINTER_OFFSET(a0) + if NODE_POINTER_OFFSET==0 + addi a6,a6,12 + + stw o0,-4(a6) + else + stwu o0,8(a6) + stw a6,-4(a2) + addi a6,a6,4 + endif + bge 5,copy_lp2 + blr + endif + +copy_record_node2_3_ab_or_b: + blt copy_record_node2_3_b + +copy_record_node2_3_ab: + if NODE_POINTER_OFFSET==0 + stw a6,-4(a2) + endif + stw d0,0(a6) + + addi a0,a6,1+NODE_POINTER_OFFSET + stw a0,0-NODE_POINTER_OFFSET(a1) + + lwz a0,8-NODE_POINTER_OFFSET(a1) + stw o0,4(a6) + + if COPIED_VECTOR + lea a1,heap_copied_vector + sub d0,a0,a3 + lwz a1,0(a1) + + tstmbit a1,d0,d1,o0,o1,o2,3 + bne record_arguments_already_copied_2 + + li o0,128 + srw o0,o0,o2 + or o1,o1,o0 + stbx o1,a1,d1 + endif + + slwi o0,d2,2 + lwz o1,0-NODE_POINTER_OFFSET(a0) + sub o0,o4,o0 + + subi d0,o0,3 + subi o0,o0,4 + + if NODE_POINTER_OFFSET==0 + stw d0,8(a6) + addi a6,a6,12 + else + stwu d0,8(a6) + stw a6,-4(a2) + addi a6,a6,4 + endif + + b cp_record_arg_lp3_c + +copy_record_node2_3_b: + stwu d0,-12(o4) + stw o4,-4(a2) + + addi a0,o4,1+NODE_POINTER_OFFSET + stw a0,0-NODE_POINTER_OFFSET(a1) + + lwz a0,8-NODE_POINTER_OFFSET(a1) + stw o0,4(o4) + + if COPIED_VECTOR + lea a1,heap_copied_vector + sub d0,a0,a3 + lwz a1,0(a1) + + tstmbit a1,d0,d1,o0,o1,o2,3 + bne record_arguments_already_copied_3 + + li o0,128 + srw o0,o0,o2 + or o1,o1,o0 + stbx o1,a1,d1 + endif + + slwi o0,d2,2 + lwz o1,0-NODE_POINTER_OFFSET(a0) + sub o0,o4,o0 + + subi d0,o0,3 + subi o0,o0,4 + + stw o0,8(o4) + +cp_record_arg_lp3_c: + + stw d0,0-NODE_POINTER_OFFSET(a0) + mr o4,o0 + stw o1,0(o0) + +cp_record_arg_lp3: + lwzu o1,4(a0) + subic. d2,d2,1 + stwu o1,4(o0) + bgt cp_record_arg_lp3 + + bge 5,copy_lp2 + blr + + if COPIED_VECTOR +record_arguments_already_copied_3: + lwz o0,0-NODE_POINTER_OFFSET(a0) + bsubi o0,1 + stw o0,8(o4) + bge 5,copy_lp2 + blr + endif + + else copy_record_2: subic. d2,d2,258 lwz o0,4-NODE_POINTER_OFFSET(a1) @@ -525,23 +816,23 @@ copy_record_2: lwz o1,8-NODE_POINTER_OFFSET(a1) stw o0,4(a6) - if NODE_POINTER_OFFSET==0 + if NODE_POINTER_OFFSET==0 stw o1,8(a6) baddi a6,12 - else + else stwu o1,8(a6) stw a6,-4(a2) baddi a6,4 - endif + endif bge 5,copy_lp2 blr copy_record_node2_1: stw o0,4-NODE_POINTER_OFFSET(a6) baddi a6,8 - if NODE_POINTER_OFFSET + if NODE_POINTER_OFFSET stw a6,-4(a2) - endif + endif bge 5,copy_lp2 blr @@ -549,7 +840,7 @@ copy_record_node2_3: lwz a0,8-NODE_POINTER_OFFSET(a1) stw o0,4(a6) - if COPIED_VECTOR + if COPIED_VECTOR lea a1,heap_copied_vector sub d0,a0,a3 lwz a1,0(a1) @@ -561,32 +852,32 @@ copy_record_node2_3: srw o0,o0,o2 or o1,o1,o0 stbx o1,a1,d1 - endif - if NODE_POINTER_OFFSET==0 + endif + if NODE_POINTER_OFFSET==0 addi a1,a6,12 stw a1,8(a6) - else + else addi a1,a6,12+NODE_POINTER_OFFSET stwu a1,8(a6) stw a6,-4(a2) - endif + endif lwz o1,0-NODE_POINTER_OFFSET(a0) addi a1,a1,1 stw a1,0-NODE_POINTER_OFFSET(a0) - if NODE_POINTER_OFFSET==0 + if NODE_POINTER_OFFSET==0 stwu o1,12(a6) - else + else stwu o1,4(a6) - endif + endif subi d2,d2,1 cp_record_arg_lp2: - if NODE_POINTER_OFFSET + if NODE_POINTER_OFFSET lwz o1,4-NODE_POINTER_OFFSET(a0) baddi a0,4 - else + else lwzu o1,4(a0) - endif + endif subic. d2,d2,1 stwu o1,4(a6) bge cp_record_arg_lp2 @@ -596,20 +887,21 @@ cp_record_arg_lp2: bge 5,copy_lp2 blr - if COPIED_VECTOR + if COPIED_VECTOR record_arguments_already_copied_2: lwz o0,0-NODE_POINTER_OFFSET(a0) - if NODE_POINTER_OFFSET==0 + if NODE_POINTER_OFFSET==0 addi a6,a6,12 stw o0,-4(a6) - else + else stwu o0,8(a6) stw a6,-4(a2) addi a6,a6,4 - endif + endif bge 5,copy_lp2 blr + endif endif not_in_hnf_2: @@ -718,10 +1010,6 @@ copy_selector_2: beq copy_indirection_2 mr a0,d0 - -; if no selectors -; b copy_arity_1_node2_ - blt copy_record_selector_2 if LINUX @@ -730,6 +1018,9 @@ copy_selector_2: lha d2,-6(a0) endif lwz a0,4-NODE_POINTER_OFFSET(a1) + if ! LINUX + lwzx d2,rtoc,d2 + endif lwz d1,0-NODE_POINTER_OFFSET(a0) andi. r0,d1,2 beq copy_arity_1_node2_ @@ -738,14 +1029,62 @@ copy_selector_2: cmplwi 0,g1,2 ble copy_selector_2_ + if ! NEW_DESCRIPTORS +copy_selector_2__: + endif + if 1 + lwz d1,8-NODE_POINTER_OFFSET(a0) + lwz g1,0(d1) + else lwz g1,8-NODE_POINTER_OFFSET(a0) - lwz g1,0-NODE_POINTER_OFFSET(g1) + lwz g1,0(g1) + endif andi. r0,g1,1 bne copy_arity_1_node2_ + if NEW_DESCRIPTORS + lhz d2,4(d2) + lea g1,__indirection + stw g1,0-NODE_POINTER_OFFSET(a1) + + cmplwi 0,d2,8 + blt copy_selector_2_1 + beq copy_selector_2_2 + + addi d1,d1,-12 + lwzx a0,d1,d2 + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz d0,0-NODE_POINTER_OFFSET(a0) + mr a1,a0 + b continue_after_selector_2 + +copy_selector_2_1: + lwz a0,4-NODE_POINTER_OFFSET(a0) + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz d0,0-NODE_POINTER_OFFSET(a0) + mr a1,a0 + b continue_after_selector_2 + +copy_selector_2_2: + lwz a0,0(d1) + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz d0,0-NODE_POINTER_OFFSET(a0) + mr a1,a0 + b continue_after_selector_2 + copy_selector_2_: - if LINUX + lhz d2,4(d2) + lea g1,__indirection + stw g1,0-NODE_POINTER_OFFSET(a1) + + lwzx a0,a0,d2 + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz d0,0-NODE_POINTER_OFFSET(a0) + mr a1,a0 + b continue_after_selector_2 else +copy_selector_2_: + if ! LINUX lwzx d2,rtoc,d2 endif lwz g1,4(d2) @@ -766,6 +1105,7 @@ copy_selector_2_: mr a1,a0 lwz d0,0-NODE_POINTER_OFFSET(a1) b continue_after_selector_2 + endif copy_record_selector_2: cmpwi 0,d2,-2-3 @@ -782,19 +1122,67 @@ copy_record_selector_2: beq copy_arity_1_node2_ lha g1,-2(d1) + if ! LINUX + lwzx d2,rtoc,d2 + endif cmplwi 0,g1,258 + if NEW_DESCRIPTORS + ble copy_record_selector_2_ + else ble copy_selector_2_ + endif + + if 1 + lhz g1,-2+2(d1) + cmplwi 0,g1,2 + bge copy_selector_2__ + endif - if COPIED_VECTOR lea g1,heap_copied_vector + if 1 + lwz d1,8-NODE_POINTER_OFFSET(a0) + lwz g1,0(g1) + sub g0,d1,a3 + + tstmbit g1,g0,o0,g1,o1,o2,3 + else lwz g0,8-NODE_POINTER_OFFSET(a0) lwz g1,0(g1) sub g0,g0,a3 tstmbit g1,g0,d1,o0,o1,o2,3 - bne copy_arity_1_node2_ endif + if NEW_DESCRIPTORS + if 1 + beq copy_record_selector_2_ + b copy_arity_1_node2_ +copy_selector_2__: + lwz d1,8-NODE_POINTER_OFFSET(a0) + lwz g1,0(d1) + andi. r0,g1,1 + bne copy_arity_1_node2_ + else + bne copy_arity_1_node2_ + endif +copy_record_selector_2_: + lhz d2,4(d2) + lea g1,__indirection + stw g1,0-NODE_POINTER_OFFSET(a1) + + cmplwi 0,d2,8 + ble copy_record_selector_3 + mr a0,d1 + addi d2,d2,-12 +copy_record_selector_3: + lwzx a0,a0,d2 + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz d0,0-NODE_POINTER_OFFSET(a0) + mr a1,a0 + b continue_after_selector_2 + else + bne copy_arity_1_node2_ b copy_selector_2_ + endif copy_strict_record_selector_2: lwz a0,4-NODE_POINTER_OFFSET(a1) @@ -803,24 +1191,66 @@ copy_strict_record_selector_2: beq copy_arity_1_node2_ lha g1,-2(d1) + if ! LINUX + lwzx d2,rtoc,d2 + endif cmplwi 0,g1,258 ble copy_strict_record_selector_2_ - if COPIED_VECTOR + if 1 + lhz g1,-2+2(d1) + cmplwi 0,g1,2 + blt copy_strict_record_selector_2_b + + lwz d1,8-NODE_POINTER_OFFSET(a0) + lwz g1,0(d1) + andi. r0,g1,1 + bne copy_arity_1_node2_ + b copy_strict_record_selector_2_ + +copy_strict_record_selector_2_b: + endif + lea g1,heap_copied_vector - lwz g0,8-NODE_POINTER_OFFSET(a0) + lwz d1,8-NODE_POINTER_OFFSET(a0) lwz g1,0(g1) - sub g0,g0,a3 + sub g0,d1,a3 tstmbit g1,g0,d1,o0,o1,o2,3 bne copy_arity_1_node2_ - endif copy_strict_record_selector_2_: - if LINUX + if NEW_DESCRIPTORS + lhz d0,4(d2) + cmplwi 0,d0,8 + ble copy_strict_record_selector_3 + addi d0,d0,-12 + lwzx d0,d1,d0 + b copy_strict_record_selector_4 +copy_strict_record_selector_3: + lwzx d0,a0,d0 +copy_strict_record_selector_4: + stw d0,4-NODE_POINTER_OFFSET(a1) + + lhz d0,6(d2) + cmplwi 0,d0,0 + beq copy_strict_record_selector_6 + cmplwi 0,d0,d1 + ble copy_strict_record_selector_5 + addi d0,d0,-12 + mr a0,d1 +copy_strict_record_selector_5: + lwzx d0,a0,d0 + stw d0,8-NODE_POINTER_OFFSET(a1) + + lwz d0,-4(d2) + stw d0,0-NODE_POINTER_OFFSET(a1) + b in_hnf_2 +copy_strict_record_selector_6: else + if ! LINUX lwzx d2,rtoc,d2 - endif + endif mr d0,a1 lwz g1,4(d2) mr a1,a0 @@ -836,6 +1266,7 @@ copy_strict_record_selector_2_: lwz d0,0-NODE_POINTER_OFFSET(a0) mr a1,a0 b in_hnf_2 + endif copy_arity_0_node2_: if NODE_POINTER_OFFSET==0 @@ -912,7 +1343,7 @@ copy_array_2: mullw d2,d2,d0 copy_array_a2: - addi a1,a6,-NODE_POINTER_OFFSET + addi a1,a6,0-NODE_POINTER_OFFSET slwi d1,d2,2 add a6,a6,d1 @@ -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 @@ -93,8 +93,10 @@ WRITE_HEAP set 0 WRITE_HEAP set 1 STDERR_TO_FILE set 1 endif +NEW_DESCRIPTORS set 1 ;PROFILE set 1 -UNBOXED_CLOSURES set 1 +PREFETCH set 0 +MARK_WITH_STACK set 1 MODULE_NAMES_IN_TIME_PROFILER set 1 @@ -104,12 +106,18 @@ MINIMUM_HEAP_SIZE set 8000 if 1 DESCRIPTOR_ARITY_OFFSET set (-2) + if NEW_DESCRIPTORS +ZERO_ARITY_DESCRIPTOR_OFFSET set (-4) + else ZERO_ARITY_DESCRIPTOR_OFFSET set (-8) + endif else DESCRIPTOR_ARITY_OFFSET set (-8) ZERO_ARITY_DESCRIPTOR_OFFSET set (-12) endif +NO_PREFETCH_MASK set 4096 + export r_to_i_buffer comm r_to_i_buffer,8 comm heap_mbp,4 @@ -141,6 +149,10 @@ ZERO_ARITY_DESCRIPTOR_OFFSET set (-12) if MEASURE_GC comm compact_garbage_collect_time,4 comm mark_compact_garbage_collect_time,4 + comm total_gc_bytes_lo,4 + comm total_gc_bytes_hi,4 + comm total_compact_gc_bytes_lo,4 + comm total_compact_gc_bytes_hi,4 endif export saved_heap_p comm saved_heap_p,8 @@ -306,10 +318,6 @@ garbage_collector_name: dc.b 0 align 2 endif - if WRITE_HEAP - comm heap2_begin_and_end,8 - endif - align 3 entier_constants_and_buffers: dc.d "0.0" @@ -318,7 +326,18 @@ entier_constants_and_buffers: dc.l 0x00000000 dc.l 0x43300000 dc.l 0x80000000 - + if MEASURE_GC +f_power2_52: + dc.l 0x43300000 + dc.l 0x00000000 +f_60: + dc.d "60" +f_1000000: + dc.d "1000000" + endif + if WRITE_HEAP + comm heap2_begin_and_end,8 + endif if FINALIZERS import __Nil import e____system__kFinalizer @@ -331,7 +350,6 @@ entier_constants_and_buffers: if STACK_OVERFLOW_EXCEPTION_HANDLER import .allocate_a_stack endif - align 1 csect text{PR} @@ -458,6 +476,7 @@ entier_constants_and_buffers: endif export __driver + export .print_execution_time{PR} ; from system.abc: import INT @@ -488,10 +507,12 @@ entier_constants_and_buffers: import .er_print_string import .er_print_int import .er_print_text + import .er_print_real else import .ew_print_char import .ew_print_string import .ew_print_int + import .ew_print_real endif if 0 @@ -865,7 +886,84 @@ exit: else stwu sp,-64(sp) endif - + + bl .print_execution_time + + if MACOSX + lwz sp,0(sp) + else + addi sp,sp,64 + endif +no_print_execution_time: + +exit_3: +exit_2: + lea o0,heap_mbp + if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + else + stwu sp,-64(sp) + endif + lwz o0,0(o0) + if LINUX + bl free + else + bl .DisposePtr + endif + nop + if MACOSX + lwz sp,0(sp) + else + addi sp,sp,64 + endif + +exit_1: + if STDERR_TO_FILE + lea o0,flags + lwz d0,0(o0) + andi. g0,d0,128 + beq no_close_stderr_file + + if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + else + stwu sp,-64(sp) + endif + bl .close_stderr_file + nop + if MACOSX + lwz sp,0(sp) + else + addi sp,sp,64 + endif + +no_close_stderr_file: + endif + if PROFILE + mflr r0 + stwu r0,-4(sp) + bl write_profile_information + endif + + lwz r0,76(sp) + mtlr r0 + lmw r13,0(sp) + addi sp,sp,80 + blr + + + csect .print_execution_time{PR} +.print_execution_time: + mflr r0 + stw r0,8(sp) + stwu sp,-64(sp) + + bl .add_execute_time + lea o0,time_string_1 if STDERR_TO_FILE bl .er_print_string @@ -948,6 +1046,76 @@ exit: bl _print_time + if MEASURE_GC + li o0,13 + if STDERR_TO_FILE + bl .er_print_char + else + bl .ew_print_char + endif + nop + + lea o0,total_gc_bytes_hi + lwz o0,0(o0) + if STDERR_TO_FILE + bl .er_print_int + else + bl .ew_print_int + endif + nop + + li o0,':' + if STDERR_TO_FILE + bl .er_print_char + else + bl .ew_print_char + endif + nop + + lea o0,total_gc_bytes_lo + lwz o0,0(o0) + if STDERR_TO_FILE + bl .er_print_int + else + bl .ew_print_int + endif + nop + + li o0,32 + if STDERR_TO_FILE + bl .er_print_char + else + bl .ew_print_char + endif + nop + + lea o0,total_compact_gc_bytes_hi + lwz o0,0(o0) + if STDERR_TO_FILE + bl .er_print_int + else + bl .ew_print_int + endif + nop + + li o0,':' + if STDERR_TO_FILE + bl .er_print_char + else + bl .ew_print_char + endif + nop + + lea o0,total_compact_gc_bytes_lo + lwz o0,0(o0) + if STDERR_TO_FILE + bl .er_print_int + else + bl .ew_print_int + endif + nop + endif + li o0,13 if STDERR_TO_FILE bl .er_print_char @@ -956,72 +1124,241 @@ exit: endif nop - if MACOSX - lwz sp,0(sp) + + lea g0,total_gc_bytes_hi + lea g1,total_gc_bytes_lo + bl fload_52_bit_int + if STDERR_TO_FILE + bl .er_print_real else - addi sp,sp,64 + bl .ew_print_real endif -no_print_execution_time: + nop -exit_3: -exit_2: - lea o0,heap_mbp - if MACOSX - mr g0,sp - ori sp,sp,28 - stwu g0,-(64+28)(sp) + li o0,' ' + bl .er_print_char + nop + + lea g0,total_compact_gc_bytes_hi + lea g1,total_compact_gc_bytes_lo + bl fload_52_bit_int + if STDERR_TO_FILE + bl .er_print_real else - stwu sp,-64(sp) + bl .ew_print_real endif - lwz o0,0(o0) - if LINUX - bl free + nop + + li o0,' ' + bl .er_print_char + nop + + lea g1,garbage_collect_time + lea o1,f_power2_52 + lwz g1,0(g1) + lis o0,0x4330 + stw g1,-4(sp) + stw o0,-8(sp) + lfd f2,0(o1) + lfd f1,-8(sp) + fsub f1,f1,f2 + if STDERR_TO_FILE + bl .er_print_real else - bl .DisposePtr + bl .ew_print_real endif nop - if MACOSX - lwz sp,0(sp) + + li o0,' ' + bl .er_print_char + nop + + lea g1,mark_compact_garbage_collect_time + lea o1,f_power2_52 + lwz g1,0(g1) + lis o0,0x4330 + stw g1,-4(sp) + stw o0,-8(sp) + lfd f2,0(o1) + lfd f1,-8(sp) + fsub f1,f1,f2 + if STDERR_TO_FILE + bl .er_print_real else - addi sp,sp,64 + bl .ew_print_real endif + nop -exit_1: + li o0,' ' + bl .er_print_char + nop + + lea g1,compact_garbage_collect_time + lea o1,f_power2_52 + lwz g1,0(g1) + lis o0,0x4330 + stw g1,-4(sp) + stw o0,-8(sp) + lfd f2,0(o1) + lfd f1,-8(sp) + fsub f1,f1,f2 if STDERR_TO_FILE - lea o0,flags - lwz d0,0(o0) - andi. g0,d0,128 - beq no_close_stderr_file + bl .er_print_real + else + bl .ew_print_real + endif + nop - if MACOSX - mr g0,sp - ori sp,sp,28 - stwu g0,-(64+28)(sp) + li o0,' ' + bl .er_print_char + nop + + lea g0,total_gc_bytes_hi + lea g1,total_gc_bytes_lo + bl fload_52_bit_int + lea g1,garbage_collect_time + bl compute_mb_per_second + if STDERR_TO_FILE + bl .er_print_real else - stwu sp,-64(sp) + bl .ew_print_real endif - bl .close_stderr_file - nop - if MACOSX - lwz sp,0(sp) + nop + + li o0,' ' + bl .er_print_char + nop + + lea g0,total_compact_gc_bytes_hi + lea g1,total_compact_gc_bytes_lo + bl fload_52_bit_int + lea g1,mark_compact_garbage_collect_time + bl compute_mb_per_second + if STDERR_TO_FILE + bl .er_print_real else - addi sp,sp,64 + bl .ew_print_real endif + nop -no_close_stderr_file: + li o0,' ' + bl .er_print_char + nop + + lea g0,total_compact_gc_bytes_hi + lea g1,total_compact_gc_bytes_lo + bl fload_52_bit_int + lea g1,compact_garbage_collect_time + bl compute_mb_per_second + if STDERR_TO_FILE + bl .er_print_real + else + bl .ew_print_real endif - if PROFILE - mflr r0 - stwu r0,-4(sp) - bl write_profile_information + nop + + li o0,' ' + bl .er_print_char + nop + + lea g0,total_compact_gc_bytes_hi + lea g1,total_compact_gc_bytes_lo + bl fload_52_bit_int + lea g0,mark_compact_garbage_collect_time + lea g1,compact_garbage_collect_time + lwz g0,0(g0) + lwz g1,0(g1) + lis o0,0x4330 + add g1,g1,g0 + stw g1,-4(sp) + stw o0,-8(sp) + lfd f3,0(o1) + lfd f2,-8(sp) + lea o1,f_60 + lea o0,f_1000000 + fsub f2,f2,f3 + lfd f4,0(o1) + lfd f3,0(o0) + fmul f1,f1,f4 + fmul f2,f2,f3 + fdiv f1,f1,f2 + if STDERR_TO_FILE + bl .er_print_real + else + bl .ew_print_real endif + nop - lwz r0,76(sp) + li o0,13 + bl .er_print_char + nop + + + lea o1,execute_time + li o0,0 + stw o0,0(o1) + + lea o1,garbage_collect_time + stw o0,0(o1) + if MEASURE_GC + lea o1,mark_compact_garbage_collect_time + stw o0,0(o1) + + lea o1,compact_garbage_collect_time + stw o0,0(o1) + endif + lea o1,IO_time + stw o0,0(o1) + + lea o1,total_gc_bytes_hi + stw o0,0(o1) + lea o1,total_gc_bytes_lo + stw o0,0(o1) + lea o1,total_compact_gc_bytes_hi + stw o0,0(o1) + lea o1,total_compact_gc_bytes_lo + stw o0,0(o1) + + + lwz r0,64+8(sp) + addi sp,sp,64 mtlr r0 - lmw r13,0(sp) - addi sp,sp,80 blr +fload_52_bit_int: + lea o1,f_power2_52 + lwz g0,0(g0) + lwz g1,0(g1) + lis o0,0x4330 + andc g0,g0,o0 + or g0,g0,o0 + stw g1,-4(sp) + stw g0,-8(sp) + lfd f2,0(o1) + lfd f1,-8(sp) + fsub f1,f1,f2 + blr + +compute_mb_per_second: + lwz g1,0(g1) + lis o0,0x4330 + stw g1,-4(sp) + stw o0,-8(sp) + lfd f3,0(o1) + lfd f2,-8(sp) + lea o1,f_60 + lea o0,f_1000000 + fsub f2,f2,f3 + lfd f4,0(o1) + lfd f3,0(o0) + fmul f1,f1,f4 + fmul f2,f2,f3 + fdiv f1,f1,f2 + blr + + + csect text{PR} + __driver: lea o1,flags lwz o0,0(o1) @@ -1176,7 +1513,21 @@ print_symbol_2: cmpwi 0,d1,0 bne end_print_symbol -printD_: lha d1,-2(d0) +printD_: + lha d1,-2(d0) + if NEW_DESCRIPTORS + cmplwi 0,d1,256 + bge print_record + + lhz d1,0(d0) + addi a2,d0,10 + add a2,a2,d1 + b print_string_a2 + +print_record: + lwz a2,-6(d0) + b print_string_a2 + else addi a2,d0,-2 cmplwi 0,d1,256 @@ -1194,6 +1545,7 @@ printD_: lha d1,-2(d0) print_record: lwz a2,-4(a2) b print_string_a2 + endif end_print_symbol: lwz r0,0(sp) @@ -1486,13 +1838,23 @@ eprint__string__: blr csect .eprintD -eprintD: andi. r0,d0,2 +eprintD: + andi. r0,d0,2 bne eprintD_ mr a2,d0 b eprint_string_a2 -eprintD_: lha d1,-2(d0) +eprintD_: + lha d1,-2(d0) + if NEW_DESCRIPTORS + cmplwi 0,d1,256 + bge eprint_record + + lhz d1,0(d0) + addi a2,d0,10 + add a2,a2,d1 + else addi a2,d0,-2 cmplwi 0,d1,256 @@ -1505,10 +1867,15 @@ eprintD_: lha d1,-2(d0) addi a2,a2,4 slwi d1,d1,3 add a2,a2,d1 + endif b eprint_string_a2 eprint_record: + if NEW_DESCRIPTORS + lwz a2,-6(d0) + else lwz a2,-4(a2) + endif eprint_string_a2: lwz o1,0(a2) @@ -1545,7 +1912,16 @@ eprint_string_a2: csect .DtoAC -DtoAC: lha d1,-2(d0) +DtoAC: + lha d1,-2(d0) + if NEW_DESCRIPTORS + cmplwi 0,d1,256 + bge DtoAC_record + + lhz d1,0(d0) + addi a0,d0,10 + add a0,a0,d1 + else addi a0,d0,-2 cmplwi 0,d1,256 @@ -1553,12 +1929,13 @@ DtoAC: lha d1,-2(d0) slwi d1,d1,3 bsub a0,d1 - if 1 + lhz d1,DESCRIPTOR_ARITY_OFFSET(a0) baddi a0,4 slwi d1,d1,3 badd a0,d1 endif + DtoAC_a0: lwz d2,0(a0) mr a2,a0 @@ -1597,7 +1974,11 @@ DtoAC_gc: mflr r0 b DtoAC_r_gc DtoAC_record: + if NEW_DESCRIPTORS + lwz a0,-6(d0) + else lwz a0,-4(a0) + endif b DtoAC_a0 csect .push_a_r_args @@ -2713,6 +3094,22 @@ end_zero_bit_vector: stw o4,0(o0) sub d7,o4,a6 + + if MEASURE_GC + lea o1,heap_size_129 + lea o0,total_gc_bytes_lo + lwz d0,0(o1) + lwz o1,0(o0) + slwi d0,d0,6 + sub d0,d0,d7 + addc o1,o1,d0 + stw o1,0(o0) + lea o0,total_gc_bytes_hi + lwz o1,0(o0) + addze o1,o1 + stw o1,0(o0) + endif + srwi d7,d7,2 bl .add_garbage_collect_time @@ -3306,7 +3703,17 @@ no_zero_bits: no_smaller_heap: endif + + if PREFETCH + lea o0,flags + lwz o0,0(o0) + andi. r0,o0,NO_PREFETCH_MASK + beq pmark + endif include 'pmark.a' + if PREFETCH + include 'pmark_prefetch.a' + endif compact_gc: lea o0,zero_bits_before_mark @@ -3324,7 +3731,6 @@ compact_gc: no_mark5: endif - include 'pcompact.a' lea o0,heap_size_33 @@ -3484,6 +3890,17 @@ vector_at_end_2: no_copy_garbage_collection: if MEASURE_GC bl .add_compact_garbage_collect_time + + sub d0,a6,d6 + + lea o0,total_compact_gc_bytes_lo + lwz o1,0(o0) + addc o1,o1,d0 + stw o1,0(o0) + lea o0,total_compact_gc_bytes_hi + lwz o1,0(o0) + addze o1,o1 + stw o1,0(o0) else bl .add_garbage_collect_time endif @@ -5223,6 +5640,7 @@ _st_fillr5_array: bge _fillr5_array_1 blr + if !NEW_DESCRIPTORS csect .yet_args_needed yet_args_needed: ; for more than 4 arguments @@ -5382,6 +5800,7 @@ gc_r_24: gc_24: mflr r0 bl collect_2 b gc_r_24 + endif csect .repl_args_b repl_args_b: @@ -5982,6 +6401,9 @@ entier_real_2: lwz RTOC,4(r3) bctr + if NEW_DESCRIPTORS + include 'pap.a' + endif if MACOSX export .call_function_0{PR} @@ -6129,6 +6551,10 @@ entier_real_2: if MEASURE_GC tc compact_garbage_collect_time{TC},compact_garbage_collect_time{BS} tc mark_compact_garbage_collect_time{TC},mark_compact_garbage_collect_time{BS} + tc total_gc_bytes_lo{TC},total_gc_bytes_lo{BS} + tc total_gc_bytes_hi{TC},total_gc_bytes_hi{BS} + tc total_compact_gc_bytes_lo{TC},total_compact_gc_bytes_lo{BS} + tc total_compact_gc_bytes_hi{TC},total_compact_gc_bytes_hi{BS} endif tc heap_end_after_copy_gc{TC},heap_end_after_copy_gc{BS} tc caf_listp{TC},caf_listp{BS} @@ -6195,6 +6621,10 @@ entier_real_2: if MEASURE_GC te time_string_2a endif + if PREFETCH + te queue + te rmarkp_queue + endif te time_string_3 te time_string_4 te true_c_string @@ -6202,6 +6632,11 @@ entier_real_2: te zero_length_string te garbage_collect_flag te entier_constants_and_buffers + if MEASURE_GC + te f_power2_52 + te f_60 + te f_1000000 + endif if WRITE_HEAP tc first_function{TC},first_function{DS} @@ -6211,3 +6646,8 @@ entier_real_2: if PROFILE te garbage_collector_name endif + + export print_execution_time{DS} + csect print_execution_time{DS} + dc.l .print_execution_time{PR} + dc.l TOC{tc0} |