diff options
-rw-r--r-- | macho/Makefile | 4 | ||||
-rw-r--r-- | macho/pap.a | 2787 | ||||
-rw-r--r-- | macho/pcompact.a | 779 | ||||
-rw-r--r-- | macho/pcompact_rmark.a | 939 | ||||
-rw-r--r-- | macho/pcompact_rmarkr.a | 856 | ||||
-rw-r--r-- | macho/pcopy.a | 496 | ||||
-rw-r--r-- | macho/pmark.a | 501 | ||||
-rw-r--r-- | macho/pstartup.a | 184 |
8 files changed, 5595 insertions, 951 deletions
diff --git a/macho/Makefile b/macho/Makefile index 3ad80cf..9897e11 100644 --- a/macho/Makefile +++ b/macho/Makefile @@ -5,10 +5,10 @@ all: _startup.o _startupProfile.o _startupTrace.o _startup2.o _startup3.o _libra _startup.o: pstartup_.a as pstartup_.a -o _startup.o -pstartup_.a: pstartup.a pmark.a pcompact.a pcopy.a pmacros.a +pstartup_.a: pstartup.a pmark.a pcompact.a pcompact_rmark.a pcompact_rmarkr.a pcopy.a pmacros.a pap.a cpp -DPROFILE=0 pstartup.a > pstartup_.a -pstartup_p.a: pstartup.a pmark.a pcompact.a pcopy.a pmacros.a +pstartup_p.a: pstartup.a pmark.a pcompact.a pcopy.a pmacros.a pap.a cpp -DPROFILE=1 pstartup.a > pstartup_p.a diff --git a/macho/pap.a b/macho/pap.a new file mode 100644 index 0000000..a8376b6 --- /dev/null +++ b/macho/pap.a @@ -0,0 +1,2787 @@ + + .text + + .globl ap_2 + .globl ap_3 + .globl ap_4 + .globl ap_5 + .globl ap_6 + .globl ap_7 + .globl ap_8 + .globl ap_9 + .globl ap_10 + .globl ap_11 + .globl ap_12 + .globl ap_13 + .globl ap_14 + .globl ap_15 + .globl ap_16 + .globl ap_17 + .globl ap_18 + .globl ap_19 + .globl ap_20 + .globl ap_21 + .globl ap_22 + .globl ap_23 + .globl ap_24 + .globl ap_25 + .globl ap_26 + .globl ap_27 + .globl ap_28 + .globl ap_29 + .globl ap_30 + .globl ap_31 + .globl ap_32 + + .globl add_empty_node_2 + .globl add_empty_node_3 + .globl add_empty_node_4 + .globl add_empty_node_5 + .globl add_empty_node_6 + .globl add_empty_node_7 + .globl add_empty_node_8 + .globl add_empty_node_9 + .globl add_empty_node_10 + .globl add_empty_node_11 + .globl add_empty_node_12 + .globl add_empty_node_13 + .globl add_empty_node_14 + .globl add_empty_node_15 + .globl add_empty_node_16 + .globl add_empty_node_17 + .globl add_empty_node_18 + .globl add_empty_node_19 + .globl add_empty_node_20 + .globl add_empty_node_21 + .globl add_empty_node_22 + .globl add_empty_node_23 + .globl add_empty_node_24 + .globl add_empty_node_25 + .globl add_empty_node_26 + .globl add_empty_node_27 + .globl add_empty_node_28 + .globl add_empty_node_29 + .globl add_empty_node_30 + .globl add_empty_node_31 + .globl add_empty_node_32 + + .globl yet_args_needed_5 + .globl yet_args_needed_6 + .globl yet_args_needed_7 + .globl yet_args_needed_8 + .globl yet_args_needed_9 + .globl yet_args_needed_10 + .globl yet_args_needed_11 + .globl yet_args_needed_12 + .globl yet_args_needed_13 + .globl yet_args_needed_14 + .globl yet_args_needed_15 + .globl yet_args_needed_16 + .globl yet_args_needed_17 + .globl yet_args_needed_18 + .globl yet_args_needed_19 + .globl yet_args_needed_20 + .globl yet_args_needed_21 + .globl yet_args_needed_22 + .globl yet_args_needed_23 + .globl yet_args_needed_24 + .globl yet_args_needed_25 + .globl yet_args_needed_26 + .globl yet_args_needed_27 + .globl yet_args_needed_28 + .globl yet_args_needed_29 + .globl yet_args_needed_30 + .globl yet_args_needed_31 + + .text +; __TEXT.ap_32: + +ap_32: + lwz a3,0(a2) + li d1,32*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap32 + + .text +; __TEXT.ap_31: + +ap_31: + lwz a3,0(a2) + li d1,31*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap31 + + .text +; __TEXT.ap_30: + +ap_30: + lwz a3,0(a2) + li d1,30*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap30 + + .text +; __TEXT.ap_29: + +ap_29: + lwz a3,0(a2) + li d1,29*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap29 + + .text +; __TEXT.ap_28: + +ap_28: + lwz a3,0(a2) + li d1,28*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap28 + + .text +; __TEXT.ap_27: + +ap_27: + lwz a3,0(a2) + li d1,27*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap27 + + .text +; __TEXT.ap_26: + +ap_26: + lwz a3,0(a2) + li d1,26*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap26 + + .text +; __TEXT.ap_25: + +ap_25: + lwz a3,0(a2) + li d1,25*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap25 + + .text +; __TEXT.ap_24: + +ap_24: + lwz a3,0(a2) + li d1,24*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap24 + + .text +; __TEXT.ap_23: + +ap_23: + lwz a3,0(a2) + li d1,23*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap23 + + .text +; __TEXT.ap_22: + +ap_22: + lwz a3,0(a2) + li d1,22*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap22 + + .text +; __TEXT.ap_21: + +ap_21: + lwz a3,0(a2) + li d1,21*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap21 + + .text +; __TEXT.ap_20: + +ap_20: + lwz a3,0(a2) + li d1,20*8 + lhz o1,0(a2) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap20 + + .text +; __TEXT.ap_19: + +ap_19: + lwz a3,0(a2) + li d1,19*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap19 + + .text +; __TEXT.ap_18: + +ap_18: + lwz a3,0(a2) + li d1,18*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap18 + + .text +; __TEXT.ap_17: + +ap_17: + lwz a3,0(a2) + li d1,17*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap17 + + .text +; __TEXT.ap_16: + +ap_16: + lwz a3,0(a2) + li d1,16*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap16 + + .text +; __TEXT.ap_15: + +ap_15: + lwz a3,0(a2) + li d1,15*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap15 + + .text +; __TEXT.ap_14: + +ap_14: + lwz a3,0(a2) + li d1,14*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap14 + + .text +; __TEXT.ap_13: + +ap_13: + lwz a3,0(a2) + li d1,13*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap13 + + .text +; __TEXT.ap_12: + +ap_12: + lwz a3,0(a2) + li d1,12*8 + lhz o1,0(a2) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap12 + + .text +; __TEXT.ap_11: + +ap_11: + lwz a3,0(a2) + li d1,11*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap11 + + .text +; __TEXT.ap_10: + +ap_10: + lwz a3,0(a2) + li d1,10*80 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap10 + + .text +; __TEXT.ap_9: + +ap_9: + lwz a3,0(a2) + li d1,9*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap9 + + .text +; __TEXT.ap_8: + +ap_8: + lwz a3,0(a2) + li d1,8*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap8 + + .text +; __TEXT.ap_7: + +ap_7: + lwz a3,0(a2) + li d1,7*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap7 + + .text +; __TEXT.ap_6: + +ap_6: + lwz a3,0(a2) + li d1,6*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap6 + + .text +; __TEXT.ap_5: + +ap_5: + lwz a3,0(a2) + li d1,5*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap5 + + .text +; __TEXT.ap_4: + +ap_4: + lwz a3,0(a2) + li d1,4*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap4 + + .text +; __TEXT.ap_3: + +ap_3: + lwz a3,0(a2) + li d1,3*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap + + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap3 + + .text +; __TEXT.ap_2: + +ap_2: + lwz a3,0(a2) + li d1,2*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + bne no_fast_ap2_ + +fast_ap_2_2_: + lhz d0,-2(a3) + add d1,d1,a3 + lwz a3,-6(d1) + .if PROFILE + subi a3,a3,32 + .else + subi a3,a3,16 + .endif + cmplwi 0,d0,1 + blt repl_args_0_2 + beq repl_args_1 + + cmplwi 0,d0,3 + blt repl_args_2 + + stw a0,0(a4) + stw a1,4(a4) + addi a4,a4,8 + lwz a1,8(a2) + + b fast_ap_ + + .text +; __TEXT.no_fast_ap2_: + +no_fast_ap2_: + stw a0,0(a4) + mr a0,a1 + mr a1,a2 + lwz a2,2(a3) + addi a4,a4,4 + mflr r0 + b no_fast_ap2 + + .text +; __TEXT.fast_ap_2_2: + +fast_ap_2_2: + mr a2,a1 + mr a1,a0 + lwzu a0,-4(a4) + mtlr r0 + b fast_ap_2_2_ + + .text +; __TEXT.fast_ap_2: + +fast_ap_2: + mr a2,a1 + mr a1,a0 + lwzu a0,-4(a4) + mtlr r0 + +fast_ap: + lhz d0,-2(a3) + add d1,d1,a3 + lwz a3,-6(d1) + .if PROFILE + subi a3,a3,32 + .else + subi a3,a3,16 + .endif + cmplwi 0,d0,1 + blt repl_args_0 + beq repl_args_1 + + cmplwi 0,d0,3 + blt repl_args_2 + + stw a0,0(a4) + stw a1,4(a4) + addi a4,a4,8 + lwz a1,8(a2) + +fast_ap_: + lwz a2,4(a2) + beq repl_args_3 + + cmplwi 0,d0,5 + blt repl_args_4 + beq repl_args_5 + + cmplwi 0,d0,7 + blt repl_args_6 + + slwi d0,d0,2 + addi d0,d0,-8 + +repl_args_7_: + lwzx o0,a1,d0 + stw o0,0(a4) + subi d0,d0,4 + addi a4,a4,4 + cmplwi 0,d0,(6*4)-8 + bne repl_args_7_ + +repl_args_6: + mtctr a3 + lwz d0,16(a1) + stw d0,0(a4) + lwz d0,12(a1) + stw d0,4(a4) + lwz d0,8(a1) + stw d0,8(a4) + lwz a0,4(a1) + lwz a1,0(a1) + addi a4,a4,12 + bctr + +repl_args_0_2: + mtctr a3 + bctr + +repl_args_0: + mtctr a3 + mr a2,a1 + mr a1,a0 + lwzu a0,-4(a4) + bctr + +repl_args_1: + mtctr a3 + lwz a2,4(a2) + bctr + +repl_args_2: + stw a0,0(a4) + mr a0,a1 + addi a4,a4,4 + lwz a1,8(a2) + mtctr a3 + lwz a2,4(a2) + bctr + +repl_args_3: + mtctr a3 + lwz a0,4(a1) + lwz a1,0(a1) + bctr + +repl_args_4: + mtctr a3 + lwz d0,8(a1) + stw d0,0(a4) + lwz a0,4(a1) + lwz a1,0(a1) + addi a4,a4,4 + bctr + +repl_args_5: + mtctr a3 + lwz d0,12(a1) + stw d0,0(a4) + lwz d0,8(a1) + stw d0,4(a4) + lwz a0,4(a1) + lwz a1,0(a1) + addi a4,a4,8 + bctr + + .text +; __TEXT.no_fast_ap32: + +no_fast_ap32: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,31*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap31: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,30*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap30: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,29*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap29: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,28*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap28: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,27*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap27: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,26*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap26: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,25*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap25: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,24*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap24: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,23*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap23: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,22*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap22: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,21*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap21: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,20*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap20: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,19*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap19: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,18*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap18: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,17*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap17: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,16*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap16: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,16*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + li d1,15*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap15: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,14*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap14: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,13*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap13: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,12*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap12: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,11*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap11: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + lwz a2,2(a3) + + li d1,10*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap10: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,9*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap9: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,8*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap8: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,7*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap7: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,6*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap6: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,5*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap5: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,4*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap4: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,3*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2 + + lwz a2,2(a3) +no_fast_ap3: + mtctr a2 + stwu r0,-4(r1) + bctrl + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + + li d1,2*8 + lhz o1,0(a3) + cmpw 0,o1,d1 + beq fast_ap_2_2 + + lwz a2,2(a3) +no_fast_ap2: + mtctr a2 + stwu r0,-4(r1) + bctrl + mtlr r0 + lwz a3,0(a0) + mr a1,a0 + lwzu a0,-4(a4) + lwz a2,2(a3) + mtctr a2 + bctr + + .text +; __TEXT.add_empty_node_2: + +add_empty_node_2: + subic. d7,d7,3 + blt add_empty_node_2_gc +add_empty_node_2_gc_: + stwu a5,4(a6) + mr a2,a1 + mr a1,a0 + mr a0,a6 + addi a6,a6,8 + blr +add_empty_node_2_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_2_gc_ + + .text +; __TEXT.add_empty_node_3: + +add_empty_node_3: + subic. d7,d7,3 + blt add_empty_node_3_gc +add_empty_node_3_gc_: + stwu a5,4(a6) + stw a6,0(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_3_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_3_gc_ + + .text +; __TEXT.add_empty_node_4: + +add_empty_node_4: + subic. d7,d7,3 + blt add_empty_node_4_gc +add_empty_node_4_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + stwu a5,4(a6) + stw a6,-4(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_4_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_4_gc_ + + .text +; __TEXT.add_empty_node_5: + +add_empty_node_5: + subic. d7,d7,3 + blt add_empty_node_5_gc +add_empty_node_5_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + stwu a5,4(a6) + stw a6,-8(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_5_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_5_gc_ + + .text +; __TEXT.add_empty_node_6: + +add_empty_node_6: + subic. d7,d7,3 + blt add_empty_node_6_gc +add_empty_node_6_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) + stwu a5,4(a6) + stw a6,-12(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_6_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_6_gc_ + + .text +; __TEXT.add_empty_node_7: + +add_empty_node_7: + subic. d7,d7,3 + blt add_empty_node_7_gc +add_empty_node_7_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) + lwz a3,-16(a4) + stw a3,-12(a3) + stwu a5,4(a6) + stw a6,-16(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_7_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_7_gc_ + + .text +; __TEXT.add_empty_node_8: + +add_empty_node_8: + subic. d7,d7,3 + blt add_empty_node_8_gc +add_empty_node_8_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) + lwz a3,-16(a4) + stw a3,-12(a4) + lwz a3,-20(a4) + stw a3,-16(a4) + stwu a5,4(a6) + stw a6,-20(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_8_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_8_gc_ + + .text +; __TEXT.add_empty_node_9: + +add_empty_node_9: + subic. d7,d7,3 + blt add_empty_node_9_gc +add_empty_node_9_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) + lwz a3,-16(a4) + stw a3,-12(a4) + lwz a3,-20(a4) + stw a3,-16(a4) + lwz a3,-24(a4) + stw a3,-20(a4) + stwu a5,4(a6) + stw a6,-24(a3) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_9_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_9_gc_ + + .text +; __TEXT.add_empty_node_10: + +add_empty_node_10: + subic. d7,d7,3 + blt add_empty_node_10_gc +add_empty_node_10_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) + lwz a3,-16(a4) + stw a3,-12(a4) + lwz a3,-20(a4) + stw a3,-16(a4) + lwz a3,-24(a4) + stw a3,-20(a4) + lwz a3,-28(a4) + stw a3,-24(a4) + stwu a5,4(a6) + stw a6,-28(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_10_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_10_gc_ + + .text +; __TEXT.add_empty_node_11: + +add_empty_node_11: + subic. d7,d7,3 + blt add_empty_node_11_gc +add_empty_node_11_gc_: + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) + lwz a3,-16(a4) + stw a3,-12(a4) + lwz a3,-20(a4) + stw a3,-16(a4) + lwz a3,-24(a4) + stw a3,-20(a4) + lwz a3,-28(a4) + stw a3,-24(a4) + lwz a3,-32(a4) + stw a3,-28(a4) + stwu a5,4(a6) + stw a6,-28(a4) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_11_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_11_gc_ + + .text +; __TEXT.add_empty_node_32: + +add_empty_node_32: + li d1,7 + b add_empty_node_12_ + + .text +; __TEXT.add_empty_node_28: + +add_empty_node_28: + li d1,6 + b add_empty_node_12_ + + .text +; __TEXT.add_empty_node_24: + +add_empty_node_24: + li d1,5 + b add_empty_node_12_ + + .text +; __TEXT.add_empty_node_20: + +add_empty_node_20: + li d1,4 + b add_empty_node_12_ + + .text +; __TEXT.add_empty_node_16: + +add_empty_node_16: + li d1,3 + b add_empty_node_12_ + + .text +; __TEXT.add_empty_node_12: + +add_empty_node_12: + li d1,2 +add_empty_node_12_: + subic. d7,d7,3 + blt add_empty_node_12_gc +add_empty_node_12_gc_: + mr d0,a4 +add_empty_node_12_lp: + lwz a3,-4(d0) + stw a3,0(d0) + lwz a3,-8(d0) + stw a3,-4(d0) + lwz a3,-12(d0) + stw a3,-8(d0) + lwz a3,-16(d0) + stw a3,-12(d0) + subi d0,d0,16 + subic. d1,d1,1 + bne add_empty_node_12_lp + stwu a5,4(a6) + stw a6,0(d0) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_12_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_12_gc_ + + .text +; __TEXT.add_empty_node_29: + +add_empty_node_29: + li d1,6 + b add_empty_node_13_ + + .text +; __TEXT.add_empty_node_25: + +add_empty_node_25: + li d1,5 + b add_empty_node_13_ + + .text +; __TEXT.add_empty_node_21: + +add_empty_node_21: + li d1,4 + b add_empty_node_13_ + + .text +; __TEXT.add_empty_node_17: + +add_empty_node_17: + li d1,3 + b add_empty_node_13_ + + .text +; __TEXT.add_empty_node_13: + +add_empty_node_13: + li d1,2 +add_empty_node_13_: + subic. d7,d7,3 + blt add_empty_node_13_gc +add_empty_node_13_gc_: + mr d0,a4 + lwz a3,-4(a4) + stw a3,0(a4) +add_empty_node_13_lp: + lwz a3,-8(d0) + stw a3,-4(d0) + lwz a3,-12(d0) + stw a3,-8(d0) + lwz a3,-16(d0) + stw a3,-12(d0) + lwz a3,-20(d0) + stw a3,-16(d0) + subi d0,d0,16 + subic. d1,d1,1 + bne add_empty_node_13_lp + stwu a5,4(a6) + stw a6,-4(d0) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_13_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_13_gc_ + + .text +; __TEXT.add_empty_node_30: + +add_empty_node_30: + li d1,6 + b add_empty_node_14_ + + .text +; __TEXT.add_empty_node_26: + +add_empty_node_26: + li d1,5 + b add_empty_node_14_ + + .text +; __TEXT.add_empty_node_22: + +add_empty_node_22: + li d1,4 + b add_empty_node_14_ + + .text +; __TEXT.add_empty_node_18: + +add_empty_node_18: + li d1,3 + b add_empty_node_14_ + + .text +; __TEXT.add_empty_node_14: + +add_empty_node_14: + li d1,2 +add_empty_node_14_: + subic. d7,d7,3 + blt add_empty_node_14_gc +add_empty_node_14_gc_: + mr d0,a4 + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) +add_empty_node_14_lp: + lwz a3,-12(d0) + stw a3,-8(d0) + lwz a3,-16(d0) + stw a3,-12(d0) + lwz a3,-20(d0) + stw a3,-16(d0) + lwz a3,-24(d0) + stw a3,-20(d0) + subi d0,d0,16 + subic. d1,d1,1 + bne add_empty_node_14_lp + stwu a5,4(a6) + stw a6,-8(d0) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_14_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_14_gc_ + + .text +; __TEXT.add_empty_node_31: + +add_empty_node_31: + li d1,6 + b add_empty_node_15_ + + .text +; __TEXT.add_empty_node_27: + +add_empty_node_27: + li d1,51 + b add_empty_node_15_ + + .text +; __TEXT.add_empty_node_23: + +add_empty_node_23: + li d1,4 + b add_empty_node_15_ + + .text +; __TEXT.add_empty_node_19: + +add_empty_node_19: + li d1,3 + b add_empty_node_15_ + + .text +; __TEXT.add_empty_node_15: + +add_empty_node_15: + li d1,2 +add_empty_node_15_: + subic. d7,d7,3 + blt add_empty_node_15_gc +add_empty_node_15_gc_: + mr d0,a4 + lwz a3,-4(a4) + stw a3,0(a4) + lwz a3,-8(a4) + stw a3,-4(a4) + lwz a3,-12(a4) + stw a3,-8(a4) +add_empty_node_15_lp: + lwz a3,-16(d0) + stw a3,-12(d0) + lwz a3,-20(d0) + stw a3,-16(d0) + lwz a3,-24(d0) + stw a3,-20(d0) + lwz a3,-28(d0) + stw a3,-24(d0) + subi d0,d0,16 + subic. d1,d1,1 + bne add_empty_node_15_lp + stwu a5,4(a6) + stw a6,-12(d0) + addi a6,a6,8 + addi a4,a4,4 + blr +add_empty_node_15_gc: + stwu r0,-4(sp) + mflr r0 + bl collect_2 + lwz r0,0(sp) + addi sp,sp,4 + b add_empty_node_15_gc_ + + + .text +; __TEXT.yet_args_needed_0: + +yet_args_needed_0: + subic. d7,d7,2 + blt yet_args_needed_0_gc +yet_args_needed_0_gc_r: + stwu a0,8(a6) + lwz d0,0(a1) + addi a0,a6,4-8 + addi d0,d0,8 + stw d0,4-8(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +yet_args_needed_0_gc: + mflr r0 + bl collect_2 + b yet_args_needed_0_gc_r + + .text +; __TEXT.yet_args_needed_1: + + subic. d7,d7,3 + blt build_node_2_gc +build_node_2_gc_r: + stw d1,4(a6) + b build_node_2 + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_1: + subic. d7,d7,3 + blt yet_args_needed_1_gc +yet_args_needed_1_gc_r: + stwu a0,12(a6) + lwz d0,0(a1) + addi a0,a6,4-12 + addi d0,d0,8 + stw d0,4-12(a6) + lwz d1,4(a1) + stw d1,8-12(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +yet_args_needed_1_gc: + mflr r0 + bl collect_2 + b yet_args_needed_1_gc_r + +build_node_2: + stw a1,8(a6) + stwu a0,12(a6) + addi a0,a6,4-12 + lwz r0,0(sp) + addi sp,sp,4 + blr + +build_node_2_gc: + mflr r0 + bl collect_2 + b build_node_2_gc_r + + .text +; __TEXT.yet_args_needed_2: + + subic. d7,d7,5 + blt build_node_3_gc +build_node_3_gc_r: + stw d1,4(a6) + b build_node_3 + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_2: + subic. d7,d7,5 + blt yet_args_needed_2_gc +yet_args_needed_2_gc_r: + lwz d0,0(a1) + stw a0,8(a6) + addi d0,d0,8 + lwz d2,4(a1) + stw d0,12(a6) + addi a0,a6,12 + lwz o0,8(a1) + stw d2,16(a6) + stwu o0,4(a6) + stwu a6,16(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +yet_args_needed_2_gc: + mflr r0 + bl collect_2 + b yet_args_needed_2_gc_r + +build_node_3: + stw a2,8(a6) + stwu a1,16(a6) + stw a6,-4(a6) + stwu a0,4(a6) + addi a0,a6,4-20 + lwz r0,0(sp) + addi sp,sp,4 + blr + +build_node_3_gc: + mflr r0 + bl collect_3 + b build_node_3_gc_r + + .text +; __TEXT.yet_args_needed_3: + + subic. d7,d7,6 + blt build_node_4_gc +build_node_4_gc_r: + stw d1,4(a6) + b build_node_4 + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_3: + subic. d7,d7,6 + blt yet_args_needed_2_gc +yet_args_needed_3_gc_r: + lwz d0,0(a1) + stw a0,12(a6) + addi d0,d0,8 + lwz d2,4(a1) + stw d0,16(a6) + lwz a1,8(a1) + stw d2,20(a6) + lwz o0,0(a1) + lwz o1,4(a1) + stwu o0,4(a6) + stwu a6,20(a6) + addi a0,a6,16-24 + stw o1,8-24(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +yet_args_needed_3_gc: + mflr r0 + bl collect_2 + b yet_args_needed_3_gc_r + +build_node_4: + stw a2,8(a6) + stwu a1,16(a6) + stw a6,-4(a6) + stw a0,4(a6) + addi a0,a6,4-16 + lwzu a2,-4(a4) + stwu a2,8(a6) + lwz r0,0(sp) + addi sp,sp,4 + blr + +build_node_4_gc: + mflr r0 + bl collect_3 + b build_node_4_gc_r + + .text +; __TEXT.yet_args_needed_4: + + subic. d7,d7,7 + blt build_node_5_gc +build_node_5_gc_r: + stw d1,4(a6) + b build_node_5 + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_4: + subic. d7,d7,7 + blt yet_args_needed_4_gc +yet_args_needed_4_gc_r: + lwz d0,0(a1) + stw a0,16(a6) + addi d0,d0,8 + lwz d2,4(a1) + stw d0,20(a6) + lwz a1,8(a1) + stw d2,24(a6) + lwz o0,0(a1) + lwz o1,4(a1) + stwu o0,4(a6) + stwu a6,24(a6) + addi a0,a6,20-28 + lwz o2,8(a1) + stw o1,8-28(a6) + stw o2,12-28(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +yet_args_needed_4_gc: + mflr r0 + bl collect_2 + b yet_args_needed_4_gc_r + +build_node_5: + stw a2,8(a6) + stwu a1,16(a6) + stw a6,-4(a6) + stw a0,4(a6) + addi a0,a6,4-16 + lwz a2,-4(a4) + stw a2,8(a6) + lwzu a2,-8(a4) + stwu a2,12(a6) + lwz r0,0(sp) + addi sp,sp,4 + blr + +build_node_5_gc: + mflr r0 + bl collect_3 + b build_node_5_gc_r + + .text +; __TEXT.yet_args_needed_5: + + subic. d7,d7,8 + blt build_node_6_gc +build_node_6_gc_r: + li d0,1 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_5: + lwz d1,0(a1) + li d0,8 + b yet_args_needed_ + +build_node_6_gc: + mflr r0 + bl collect_3 + b build_node_6_gc_r + + .text +; __TEXT.yet_args_needed_6: + + subic. d7,d7,9 + blt build_node_7_gc +build_node_7_gc_r: + li d0,2 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_6: + lwz d1,0(a1) + li d0,9 + b yet_args_needed_ + +build_node_7_gc: + mflr r0 + bl collect_3 + b build_node_7_gc_r + + .text +; __TEXT.yet_args_needed_7: + + subic. d7,d7,10 + blt build_node_8_gc +build_node_8_gc_r: + li d0,3 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_7: + lwz d1,0(a1) + li d0,10 + b yet_args_needed_ + +build_node_8_gc: + mflr r0 + bl collect_3 + b build_node_8_gc_r + + .text +; __TEXT.yet_args_needed_8: + + subic. d7,d7,11 + blt build_node_9_gc +build_node_9_gc_r: + li d0,4 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_8: + lwz d1,0(a1) + li d0,11 + b yet_args_needed_ + +build_node_9_gc: + mflr r0 + bl collect_3 + b build_node_9_gc_r + + .text +; __TEXT.yet_args_needed_9: + + subic. d7,d7,12 + blt build_node_10_gc +build_node_10_gc_r: + li d0,5 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_9: + lwz d1,0(a1) + li d0,12 + b yet_args_needed_ + +build_node_10_gc: + mflr r0 + bl collect_3 + b build_node_10_gc_r + + .text +; __TEXT.yet_args_needed_10: + + subic. d7,d7,13 + blt build_node_11_gc +build_node_11_gc_r: + li d0,6 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_10: + lwz d1,0(a1) + li d0,13 + b yet_args_needed_ + +build_node_11_gc: + mflr r0 + bl collect_3 + b build_node_11_gc_r + + .text +; __TEXT.yet_args_needed_11: + + subic. d7,d7,14 + blt build_node_12_gc +build_node_12_gc_r: + li d0,7 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_11: + lwz d1,0(a1) + li d0,14 + b yet_args_needed_ + +build_node_12_gc: + mflr r0 + bl collect_3 + b build_node_12_gc_r + + .text +; __TEXT.yet_args_needed_12: + + subic. d7,d7,15 + blt build_node_13_gc +build_node_13_gc_r: + li d0,8 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_12: + lwz d1,0(a1) + li d0,15 + b yet_args_needed_ + +build_node_13_gc: + mflr r0 + bl collect_3 + b build_node_13_gc_r + + .text +; __TEXT.yet_args_needed_13: + + subic. d7,d7,16 + blt build_node_14_gc +build_node_14_gc_r: + li d0,9 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_13: + lwz d1,0(a1) + li d0,16 + b yet_args_needed_ + +build_node_14_gc: + mflr r0 + bl collect_3 + b build_node_14_gc_r + + .text +; __TEXT.yet_args_needed_14: + + subic. d7,d7,17 + blt build_node_15_gc +build_node_15_gc_r: + li d0,10 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_14: + lwz d1,0(a1) + li d0,17 + b yet_args_needed_ + +build_node_15_gc: + mflr r0 + bl collect_3 + b build_node_15_gc_r + + .text +; __TEXT.yet_args_needed_15: + + subic. d7,d7,18 + blt build_node_16_gc +build_node_16_gc_r: + li d0,11 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_15: + lwz d1,0(a1) + li d0,18 + b yet_args_needed_ + +build_node_16_gc: + mflr r0 + bl collect_3 + b build_node_16_gc_r + + .text +; __TEXT.yet_args_needed_16: + + subic. d7,d7,19 + blt build_node_17_gc +build_node_17_gc_r: + li d0,12 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_16: + lwz d1,0(a1) + li d0,19 + b yet_args_needed_ + +build_node_17_gc: + mflr r0 + bl collect_3 + b build_node_17_gc_r + + .text +; __TEXT.yet_args_needed_17: + + subic. d7,d7,20 + blt build_node_18_gc +build_node_18_gc_r: + li d0,13 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_17: + lwz d1,0(a1) + li d0,20 + b yet_args_needed_ + +build_node_18_gc: + mflr r0 + bl collect_3 + b build_node_18_gc_r + + .text +; __TEXT.yet_args_needed_18: + + subic. d7,d7,21 + blt build_node_19_gc +build_node_19_gc_r: + li d0,14 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_18: + lwz d1,0(a1) + li d0,21 + b yet_args_needed_ + +build_node_19_gc: + mflr r0 + bl collect_3 + b build_node_19_gc_r + + .text +; __TEXT.yet_args_needed_19: + + subic. d7,d7,22 + blt build_node_20_gc +build_node_20_gc_r: + li d0,15 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_19: + lwz d1,0(a1) + li d0,22 + b yet_args_needed_ + +build_node_20_gc: + mflr r0 + bl collect_3 + b build_node_20_gc_r + + .text +; __TEXT.yet_args_needed_20: + + subic. d7,d7,23 + blt build_node_21_gc +build_node_21_gc_r: + li d0,16 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_20: + lwz d1,0(a1) + li d0,23 + b yet_args_needed_ + +build_node_21_gc: + mflr r0 + bl collect_3 + b build_node_21_gc_r + + .text +; __TEXT.yet_args_needed_21: + + subic. d7,d7,24 + blt build_node_22_gc +build_node_22_gc_r: + li d0,17 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_21: + lwz d1,0(a1) + li d0,24 + b yet_args_needed_ + +build_node_22_gc: + mflr r0 + bl collect_3 + b build_node_22_gc_r + + .text +; __TEXT.yet_args_needed_22: + + subic. d7,d7,25 + blt build_node_23_gc +build_node_23_gc_r: + li d0,18 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_22: + lwz d1,0(a1) + li d0,25 + b yet_args_needed_ + +build_node_23_gc: + mflr r0 + bl collect_3 + b build_node_23_gc_r + + .text +; __TEXT.yet_args_needed_23: + + subic. d7,d7,26 + blt build_node_24_gc +build_node_24_gc_r: + li d0,19 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_23: + lwz d1,0(a1) + li d0,26 + b yet_args_needed_ + +build_node_24_gc: + mflr r0 + bl collect_3 + b build_node_24_gc_r + + .text +; __TEXT.yet_args_needed_24: + + subic. d7,d7,27 + blt build_node_25_gc +build_node_25_gc_r: + li d0,20 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_24: + lwz d1,0(a1) + li d0,27 + b yet_args_needed_ + +build_node_25_gc: + mflr r0 + bl collect_3 + b build_node_25_gc_r + + .text +; __TEXT.yet_args_needed_25: + + subic. d7,d7,28 + blt build_node_26_gc +build_node_26_gc_r: + li d0,21 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_25: + lwz d1,0(a1) + li d0,28 + b yet_args_needed_ + +build_node_26_gc: + mflr r0 + bl collect_3 + b build_node_26_gc_r + + .text +; __TEXT.yet_args_needed_26: + + subic. d7,d7,29 + blt build_node_27_gc +build_node_27_gc_r: + li d0,22 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_26: + lwz d1,0(a1) + li d0,29 + b yet_args_needed_ + +build_node_27_gc: + mflr r0 + bl collect_3 + b build_node_27_gc_r + + .text +; __TEXT.yet_args_needed_27: + + subic. d7,d7,30 + blt build_node_28_gc +build_node_28_gc_r: + li d0,23 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_27: + lwz d1,0(a1) + li d0,30 + b yet_args_needed_ + +build_node_28_gc: + mflr r0 + bl collect_3 + b build_node_28_gc_r + + .text +; __TEXT.yet_args_needed_28: + + subic. d7,d7,31 + blt build_node_29_gc +build_node_29_gc_r: + li d0,24 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_28: + lwz d1,0(a1) + li d0,31 + b yet_args_needed_ + +build_node_29_gc: + mflr r0 + bl collect_3 + b build_node_29_gc_r + + .text +; __TEXT.yet_args_needed_29: + + subic. d7,d7,32 + blt build_node_30_gc +build_node_30_gc_r: + li d0,25 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_29: + lwz d1,0(a1) + li d0,32 + b yet_args_needed_ + +build_node_30_gc: + mflr r0 + bl collect_3 + b build_node_30_gc_r + + .text +; __TEXT.yet_args_needed_30: + + subic. d7,d7,33 + blt build_node_31_gc +build_node_31_gc_r: + li d0,26 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_30: + lwz d1,0(a1) + li d0,33 + b yet_args_needed_ + +build_node_31_gc: + mflr r0 + bl collect_3 + b build_node_31_gc_r + + .text +; __TEXT.yet_args_needed_31: + + subic. d7,d7,34 + blt build_node_32_gc +build_node_32_gc_r: + li d0,27 + b build_node_ + .if PROFILE + nop + nop + nop + nop + .endif + +yet_args_needed_31: + lwz d1,0(a1) + li d0,34 + b yet_args_needed_ + +build_node_32_gc: + mflr r0 + bl collect_3 + b build_node_32_gc_r + + .text +; __TEXT.yet_args_needed: + +yet_args_needed: + lwz d1,0(a1) + lhz d0,-2(d1) + addi d0,d0,3 + +yet_args_needed_: + sub. d7,d7,d0 + blt yet_args_needed_gc + +yet_args_needed_gc_r: + lwz d3,4(a1) + subi d0,d0,1+4+3 + lwz a1,8(a1) + addi d2,a6,4 + lwz o0,0(a1) + lwz o1,4(a1) + stw o0,4(a6) + lwz o2,8(a1) + stw o1,8(a6) + addi a1,a1,12 + stwu o2,12(a6) + +yet_args_needed_cp_a: + lwz o0,0(a1) + addi a1,a1,4 + stwu o0,4(a6) + subic. d0,d0,1 + bge yet_args_needed_cp_a + + stw a0,4(a6) + addi d1,d1,8 + stw d1,8(a6) + addi a0,a6,8 + stw d3,12(a6) + stwu d2,16(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +yet_args_needed_gc: + mflr r0 + bl collect_2 + b yet_args_needed_gc_r + + .text +; __TEXT.build_node_: + +build_node_: + stw d1,4(a6) + stw a2,8(a6) + stwu a1,16(a6) + stw a6,-4(a6) + stw a0,4(a6) + addi a0,a6,4-16 + lwz a2,-4(a4) + stw a2,8(a6) + lwzu a2,-8(a4) + stwu a2,12(a6) + +build_node_cp_a: + lwz a2,-4(a4) + subi a4,a4,4 + subic. d0,d0,1 + stwu a2,4(a6) + bne build_node_cp_a + + lwz r0,0(sp) + addi sp,sp,4 + blr diff --git a/macho/pcompact.a b/macho/pcompact.a index e03b263..3ded6e7 100644 --- a/macho/pcompact.a +++ b/macho/pcompact.a @@ -1,7 +1,6 @@ ; mark used nodes and pointers in argument parts and link backward pointers - lea o0,heap_size_33 lwz d7,0(o0) @@ -9,20 +8,24 @@ slwi d7,d7,5 lwz d0,0(o0) - stwu a4,-4(sp) li g3,128 + subi d4,sp,8000 + + stwu a4,-4(sp) + cmpwi cr0,d0,0 beq end_mark_cafs mark_cafs_lp: lwz d1,0(d0) lwz o5,-4(d0) - addi a2,d0,4 + + addi a3,d0,4 slwi d0,d1,2 - add a4,a2,d0 + add a4,a3,d0 - bl mark_stack_nodes + bl rmark_stack_nodes addic. d0,o5,0 bne mark_cafs_lp @@ -31,764 +34,16 @@ end_mark_cafs: lea o0,stack_p lwz a4,0(sp) - lwz a2,0(o0) - addi sp,sp,4 - - bl mark_stack_nodes - - b compact_heap - -mark_stack_nodes3: - stw a0,-4(a2) - b mark_stack_nodes - -mark_stack_nodes2: - lwz g1,0(a0) - addi d0,a2,1-4 - stw g1,-4(a2) - stw d0,0(a0) - -mark_stack_nodes: - cmpw 0,a4,a2 - beq end_mark_nodes - - lwz a0,0(a2) - addi a2,a2,4 - - sub d0,a0,d6 - .if SHARE_CHAR_INT - cmplw 0,d0,d7 - bge- mark_stack_nodes - .endif - - srwi o0,d0,5 - lbzx o1,o4,o0 - rlwinm o2,d0,32-2,29,31 - rlwnm. r0,o1,o2,24,24 - bne- mark_stack_nodes2 - - li d3,0 - li d5,1 - -mark_arguments: - lwz d0,0-NODE_POINTER_OFFSET(a0) - srw o3,g3,o2 - - or o1,o1,o3 - - andi. r0,d0,2 - lha d2,-2(d0) - - stbx o1,o4,o0 - - cmpwi 6,d2,0 - beq mark_lazy_node - - beq cr6,mark_hnf_0 - - cmplwi 0,d2,256 - addi a0,a0,4 - bge mark_record - - subic. d2,d2,2 - beq mark_hnf_2 - blt mark_hnf_1 - -mark_hnf_3: - lwz a1,4-NODE_POINTER_OFFSET(a0) -mark_hnf_3_: - sub d0,a1,d6 - srwi o0,d0,5 - lbzx o1,o4,o0 - rlwinm o2,d0,32-2,29,31 - srw o3,g3,o2 - and. r0,o1,o3 - bne shared_argument_part - - or o1,o1,o3 - stbx o1,o4,o0 - -no_shared_argument_part: - lwz o0,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - ori o0,o0,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - stwu d3,4-NODE_POINTER_OFFSET(a0) - - lwz o0,0-NODE_POINTER_OFFSET(a1) - slwi d2,d2,2 - ori o0,o0,1 - stw o0,0-NODE_POINTER_OFFSET(a1) - - lwzux d2,a1,d2 - li d5,0 - stw a0,0-NODE_POINTER_OFFSET(a1) - mr d3,a1 - mr a0,d2 - b mark_node - -shared_argument_part: - cmplw 0,a1,a0 - bgt mark_hnf_1 - - lwz o0,0-NODE_POINTER_OFFSET(a1) - addi d0,a0,4+2+1 - stw d0,0-NODE_POINTER_OFFSET(a1) - stw o0,4-NODE_POINTER_OFFSET(a0) - b mark_hnf_1 - -mark_lazy_node_1: -; remove if no selectors: - bne mark_selector_node_1 -mark_hnf_1: - lwz d2,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,2 - mr a0,d2 - b mark_node - -mark_selector_node_1: - baddicc d2,3 - lwz a1,0-NODE_POINTER_OFFSET(a0) - beq mark_indirection_node - - addic. d2,d2,1 - sub o2,a1,d6 - ble mark_record_selector_node_1 - - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. r0,d2,2 - beq mark_hnf_1 - - lha g1,-2(d2) - cmplwi 0,g1,2 - ble small_tuple_or_record - -large_tuple_or_record: - lwz d1,8-NODE_POINTER_OFFSET(a1) - - sub o2,d1,d6 - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - -small_tuple_or_record: - lwz g1,-8(d0) - mflr r0 - andc o1,o1,o3 - - lwz g1,4(g1) - subi d2,a0,4 - - mtlr g1 - stbx o1,o4,o0 - mr a0,a1 - stwu r0,-4(sp) - blrl - mtlr r0 - - lea g1,__indirection - stw a0,4-NODE_POINTER_OFFSET(d2) - stw g1,0-NODE_POINTER_OFFSET(d2) - b mark_node - -mark_record_selector_node_1: - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - beq mark_strict_record_selector_node_1 - - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. r0,d2,2 - beq mark_hnf_1 - - lha g1,-2(d2) - cmplwi 0,g1,258 - ble small_tuple_or_record - b large_tuple_or_record - -mark_strict_record_selector_node_1: - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. r0,d2,2 - beq mark_hnf_1 - - lha g1,-2(d2) - cmplwi 0,g1,258 - ble select_from_small_record - - lwz d1,8-NODE_POINTER_OFFSET(a1) - sub o2,d1,d6 - - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - -select_from_small_record: - lwz g1,-8(d0) - mflr r0 - subi a0,a0,4 - lwz g1,4(g1) - - mtlr g1 - stwu r0,-4(sp) - blrl - mtlr r0 - - b mark_next_node - -mark_indirection_node: - andc o1,o1,o3 - stbx o1,o4,o0 - - mr a0,a1 - b mark_node - -mark_hnf_2: - lwz o0,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - ori o0,o0,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - lwzu d2,4-NODE_POINTER_OFFSET(a0) - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,0 - mr a0,d2 - -mark_node: - sub d0,a0,d6 - .if SHARE_CHAR_INT - cmplw 0,d0,d7 - bge- mark_next_node_after_static - .endif - srwi o0,d0,5 - lbzx o1,o4,o0 - rlwinm o2,d0,32-2,29,31 - rlwnm. r0,o1,o2,24,24 - beq+ mark_arguments - -mark_next_node: - cmpwi 0,d5,0 - bne mark_parent - - lwzu d2,-4-NODE_POINTER_OFFSET(d3) - lwz o0,4-NODE_POINTER_OFFSET(d3) - andi. d5,d2,3 - - cmpwi 0,d5,3 - beq argument_part_cycle1 - - stw o0,0-NODE_POINTER_OFFSET(d3) - -c_argument_part_cycle1: - cmplw 0,a0,d3 - bgt no_reverse_1 - - lwz o0,0-NODE_POINTER_OFFSET(a0) - addi d0,d3,4+1 - stw o0,4-NODE_POINTER_OFFSET(d3) - stw d0,0-NODE_POINTER_OFFSET(a0) - clrrwi a0,d2,2 - b mark_node - -no_reverse_1: - stw a0,4-NODE_POINTER_OFFSET(d3) - clrrwi a0,d2,2 - b mark_node - -mark_lazy_node: - beq cr6,mark_next_node - - bsubicc d2,1 - baddi a0,4 - ble mark_lazy_node_1 - - cmplwi 0,d2,255 - bge mark_closure_with_unboxed_arguments -mark_closure_with_unboxed_arguments_: - lwz o0,0-NODE_POINTER_OFFSET(a0) - slwi d2,d2,2 - ori o0,o0,2 - stw o0,0(a0) - - lwzux d2,a0,d2 - or d3,d3,d5 - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,0 - mr a0,d2 - b mark_node - -mark_closure_with_unboxed_arguments: -; baddi d2,1 - srwi d0,d2,8 - bandic d2,255 -; bsub d2,d0 - bsubc d2,d0 -; bsubicc d2,1 - bgt mark_closure_with_unboxed_arguments_ - beq mark_hnf_1 - bsubi a0,4 - b mark_next_node - -mark_hnf_0: - .if SHARE_CHAR_INT - cmpw d0,int_reg - bne no_int_3 - - lwz d2,4-NODE_POINTER_OFFSET(a0) - cmplwi 0,d2,33 - bge mark_next_node - - andc o1,o1,o3 - stbx o1,o4,o0 - - lea a0,small_integers - slwi d2,d2,3 - add a0,a0,d2 - b mark_next_node_after_static - -no_int_3: - cmplw d0,char_reg - bne no_char_3 - - andc o1,o1,o3 - stbx o1,o4,o0 - - lbz d2,7-NODE_POINTER_OFFSET(a0) - lea a0,static_characters - slwi d2,d2,3 - add a0,a0,d2 - b mark_next_node_after_static - -no_char_3: - blt no_normal_hnf_0 - - subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET - - andc o1,o1,o3 - stbx o1,o4,o0 - b mark_next_node_after_static - -no_normal_hnf_0: - .endif - - lea o0,__ARRAY__+2 - cmplw 0,d0,o0 - bne+ mark_next_node - b mark_array - -mark_record: - subic. d2,d2,258 - beq mark_record_2 - blt mark_record_1 - -mark_record_3: - lhz d2,-2+2(d0) - lwz a1,4-NODE_POINTER_OFFSET(a0) - subic. d2,d2,1 - blt mark_record_3_bb - - beq mark_record_3_ab - - subic. d2,d2,1 - beq mark_record_3_aab - - b mark_hnf_3_ - -mark_record_3_bb: - subi a0,a0,4 - - sub d0,a1,d6 - setmbit o4,d0,d1,o0,o1,o2,2 - - cmplw a1,a0 - bgt mark_next_node - - srwi. o0,o0,1 - - lwz o2,0-NODE_POINTER_OFFSET(a1) - addi d0,a0,8+2+1 - stw o2,8-NODE_POINTER_OFFSET(a0) - stw d0,0-NODE_POINTER_OFFSET(a1) - - bne+ not_next_byte_1 - - addi d1,d1,1 - lbzx o1,o4,d1 - li o0,128 -not_next_byte_1: - and. r0,o1,o0 - beq+ not_yet_linked_bb - - sub d0,a0,d6 - addi d0,d0,8 - setmbit o4,d0,d1,o0,o1,o2,2 - b mark_next_node - -not_yet_linked_bb: - or o1,o1,o0 - stbx o1,o4,d1 - b mark_next_node - -mark_record_3_ab: - sub d0,a1,d6 - setmbit o4,d0,d1,o0,o1,o2,2 - - cmplw 0,a1,a0 - bgt mark_hnf_1 - - srwi. o0,o0,1 - - lwz o2,0-NODE_POINTER_OFFSET(a1) - addi d0,a0,4+2+1 - stw o2,4-NODE_POINTER_OFFSET(a0) - stw d0,0-NODE_POINTER_OFFSET(a1) - - bne+ not_next_byte_2 - - addi d1,d1,1 - lbzx o1,o4,d1 - li o0,128 -not_next_byte_2: - and. r0,o1,o0 - beq+ not_yet_linked_ab - - sub d0,a0,d6 - addi d0,d0,4 - setmbit o4,d0,d1,o0,o1,o2,2 - b mark_hnf_1 - -not_yet_linked_ab: - or o1,o1,o0 - stbx o1,o4,d1 - b mark_hnf_1 - -mark_record_3_aab: - sub d0,a1,d6 - - tstmbit o4,d0,d1,o0,o1,o2,2 - bne shared_argument_part - - srw o0,g3,o2 - or o1,o1,o0 - stbx o1,o4,d1 - - lwz o0,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - ori o0,o0,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - stwu d3,4-NODE_POINTER_OFFSET(a0) - - lwz d2,0-NODE_POINTER_OFFSET(a1) - li d5,1 - stw a0,0-NODE_POINTER_OFFSET(a1) - mr d3,a1 - mr a0,d2 - b mark_node - -mark_record_2: - lhz g1,-2+2(d0) - cmplwi g1,1 - bgt mark_hnf_2 - beq mark_hnf_1 - - subi a0,a0,4 - b mark_next_node - -mark_record_1: - lhz g1,-2+2(d0) - tst g1 - bne mark_hnf_1 - - subi a0,a0,4 - b mark_next_node - -mark_array: - lwz d1,8-NODE_POINTER_OFFSET(a0) - tst d1 - beq mark_lazy_array - - lhz d0,-2(d1) - tst d0 - beq mark_b_record_array - - lhz d1,-2+2(d1) - tst d1 - beq mark_b_record_array - - subi d0,d0,256 - cmpw 0,d0,d1 - beq mark_a_record_array - -mark_ab_record_array: - mr o2,d2 - mr o3,d3 - stw d5,-4(sp) - - lwz d2,4-NODE_POINTER_OFFSET(a0) - addi a0,a0,8 - stw a0,-8(sp) - - slwi d2,d2,2 - mullw a1,d2,d0 - - sub d0,d0,d1 - addi a0,a0,4 - add a1,a1,a0 - - mflr r0 - stw r0,-12(sp) - bl reorder - lwz r0,-12(sp) - - lwz a0,-8(sp) - mtlr r0 - - lwz d0,-4(a0) - mullw d0,d0,d1 - - lwz d5,-4(sp) - mr d3,o3 - mr d2,o2 - b mark_lr_array - -mark_b_record_array: - sub d0,a0,d6 - addi d0,d0,4 - setmbit o4,d0,d1,o0,o1,o2,2 - b mark_next_node - -mark_a_record_array: - lwz d0,4-NODE_POINTER_OFFSET(a0) - addi a0,a0,8 - mullw d0,d0,d1 - b mark_lr_array - -mark_lazy_array: - lwz d0,4-NODE_POINTER_OFFSET(a0) - addi a0,a0,8 -mark_lr_array: - sub d1,a0,d6 - srwi d1,d1,2 - add d1,d1,d0 - setmbit o4,d1,d2,o0,o1,o2,0 - - cmplwi 0,d0,1 - ble mark_array_length_0_1 - - mr a1,a0 - slwi d0,d0,2 - add a0,a0,d0 - - lwz d2,0-NODE_POINTER_OFFSET(a0) - lwz o0,0-NODE_POINTER_OFFSET(a1) - stw d2,0-NODE_POINTER_OFFSET(a1) - stw o0,0-NODE_POINTER_OFFSET(a0) - - lwzu d2,-4-NODE_POINTER_OFFSET(a0) - lwzu o0,-4-NODE_POINTER_OFFSET(a1) - addi d2,d2,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - stw d2,0-NODE_POINTER_OFFSET(a1) - - lwzu d2,-4-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,0 - mr a0,d2 - b mark_node - -mark_array_length_0_1: - subi a0,a0,8 - blt mark_next_node - - lwz d1,12-NODE_POINTER_OFFSET(a0) - lwz o0,8-NODE_POINTER_OFFSET(a0) - lwz o1,4-NODE_POINTER_OFFSET(a0) - stw o0,12-NODE_POINTER_OFFSET(a0) - stw o1,8-NODE_POINTER_OFFSET(a0) - stwu d1,4-NODE_POINTER_OFFSET(a0) - b mark_hnf_1 - - -mark_parent: - tst d3 - beq mark_stack_nodes2 - - subic. d5,d5,1 - beq argument_part_parent - - cmplw a0,d3 - lwz d2,0-NODE_POINTER_OFFSET(d3) - bgt no_reverse_2 - - mr a1,a0 - addi d0,d3,1 - lwz a0,0-NODE_POINTER_OFFSET(a1) - stw d0,0-NODE_POINTER_OFFSET(a1) - -no_reverse_2: - stw a0,0-NODE_POINTER_OFFSET(d3) - subi a0,d3,4 - andi. d5,d2,3 - clrrwi d3,d2,2 - b mark_next_node - -argument_part_parent: - mr a1,d3 - mr d3,a0 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - - mr a0,a1 - -skip_upward_pointers: - andi. d0,d2,3 - cmpwi 0,d0,3 - bne no_upward_pointer - - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - b skip_upward_pointers - -no_upward_pointer: - cmplw 0,d3,a0 - bgt no_reverse_3 - - mr a6,d3 - lwz d3,0-NODE_POINTER_OFFSET(d3) - addi d0,a0,1 - stw d0,0-NODE_POINTER_OFFSET(a6) - -no_reverse_3: - stw d3,0-NODE_POINTER_OFFSET(a1) - - clrrwi d3,d2,2 - - lwzu d2,-4-NODE_POINTER_OFFSET(d3) - - cmplw 6,a0,d3 - - lwz o0,4-NODE_POINTER_OFFSET(d3) - andi. d5,d2,3 - stw o0,0-NODE_POINTER_OFFSET(d3) - - bgt cr6,no_reverse_4 - lwz o0,0-NODE_POINTER_OFFSET(a0) - stw o0,4-NODE_POINTER_OFFSET(d3) - addi d0,d3,4+2+1 - stw d0,0-NODE_POINTER_OFFSET(a0) - clrrwi a0,d2,2 - b mark_node - -no_reverse_4: - stw a0,4-NODE_POINTER_OFFSET(d3) - clrrwi a0,d2,2 - b mark_node - -argument_part_cycle1: - mr d1,a1 - -skip_pointer_list1: - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. d5,d2,3 - cmpwi 0,d5,3 - beq skip_pointer_list1 - - stw o0,0-NODE_POINTER_OFFSET(a1) - mr a1,d1 - b c_argument_part_cycle1 - - .if SHARE_CHAR_INT -mark_next_node_after_static: - cmpwi 0,d5,0 - bne mark_parent_after_static - - lwzu d2,-4-NODE_POINTER_OFFSET(d3) - lwz o0,4-NODE_POINTER_OFFSET(d3) - andi. d5,d2,3 - - cmpwi 0,d5,3 - beq argument_part_cycle2 - - stw o0,0-NODE_POINTER_OFFSET(d3) - -c_argument_part_cycle2: - stw a0,4-NODE_POINTER_OFFSET(d3) - clrrwi a0,d2,2 - b mark_node - -mark_parent_after_static: - cmpwi 0,d3,0 - beq mark_stack_nodes3 - - subic. d5,d5,1 - beq argument_part_parent_after_static - - lwz d2,0-NODE_POINTER_OFFSET(d3) - stw a0,0-NODE_POINTER_OFFSET(d3) - subi a0,d3,4 - andi. d5,d2,3 - clrrwi d3,d2,2 - b mark_next_node - -argument_part_parent_after_static: - mr a1,d3 - mr d3,a0 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - - mr a0,a1 - -skip_upward_pointers_2: - andi. d0,d2,3 - cmpwi 0,d0,3 - bne no_reverse_3 - - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - b skip_upward_pointers_2 - -argument_part_cycle2: - mr d1,a1 + lwz a3,0(o0) + addi sp,sp,4 -skip_pointer_list2: - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. d5,d2,3 - cmpwi 0,d5,3 - beq skip_pointer_list2 + bl rmark_stack_nodes - stw o0,0-NODE_POINTER_OFFSET(a1) - mr a1,d1 - b c_argument_part_cycle2 - .endif - -end_mark_nodes: - addi a2,a2,4 - blr + b compact_heap +#include "pcompact_rmark.a" +#include "pcompact_rmarkr.a" ; compact the heap @@ -875,14 +130,16 @@ finalizer_list_empty: stwu a4,-4(sp) addi a4,a2,4 - bl mark_stack_nodes + + mr a3,a2 + bl rmark_stack_nodes + lwz a4,0(sp) addi sp,sp,4 free_finalizer_list_empty: .endif - lea o0,heap_size_33 lwz d5,0(o0) slwi d2,d5,5 diff --git a/macho/pcompact_rmark.a b/macho/pcompact_rmark.a new file mode 100644 index 0000000..70d6e4a --- /dev/null +++ b/macho/pcompact_rmark.a @@ -0,0 +1,939 @@ + +rmark_stack_nodes: + mflr r0 + stwu r0,-4(sp) + b rmark_stack_nodes_ + +rmark_stack_nodes1: + lwz d1,0(a0) + addi d0,a3,1 + stw d1,0(a3) + stw d0,0(a0) + +rmark_next_stack_node: + addi a3,a3,4 + cmpw cr0,a4,a3 + beq end_rmark_nodes + +rmark_stack_nodes_: + lwz a0,0(a3) + + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmark_next_stack_node + + srwi o0,d0,5 + lbzx o1,o4,o0 + rlwinm o2,d0,32-2,29,31 + rlwnm. r0,o1,o2,24,24 + bne- rmark_stack_nodes1 + + srw o3,g3,o2 + + lwz d0,0(a0) + li g1,0 + stw a3,-4(sp) + + or o1,o1,o3 + + addi a2,a3,1 + stw d0,0(a3) + + stbx o1,o4,o0 + + li d1,-1 + stwu g1,-8(sp) + stw a2,0(a0) + bl rmark_no_reverse + + addi a3,a3,4 + cmpw cr0,a4,a3 + bne rmark_stack_nodes_ + +end_rmark_nodes: + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + blr + +rmark_node_d1: + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmark_next_node + + b rmark_node_ + +rmark_hnf_2: + addi d1,a0,4 + lwz d0,4(a0) + + cmplw 0,sp,d4 + + mr a3,a0 + lwz a0,0(a0) + + stw d1,-4(sp) + stwu d0,-8(sp) + + blt rmark_using_reversal + +rmark_node: + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmark_next_node + + mr d1,a3 + +rmark_node_: + srwi o0,d0,5 + lbzx o1,o4,o0 + rlwinm o2,d0,32-2,29,31 + rlwnm. r0,o1,o2,24,24 + bne rmark_reverse_and_mark_next_node + + srw o3,g3,o2 + or o1,o1,o3 + + lwz d0,0(a0) + + stbx o1,o4,o0 + +rmark_arguments: + cmplw 0,a0,d1 + bgt rmark_no_reverse + + addi a2,a3,1 + stw d0,0(a3) + stw a2,0(a0) + +rmark_no_reverse: + andi. r0,d0,2 + lha d2,-2(d0) + + cmpwi cr6,d2,0 + beq rmark_lazy_node + + beq cr6,rmark_hnf_0 + + cmplwi cr0,d2,256 + addi a0,a0,4 + bge rmark_record + + subic. d2,d2,2 + beq rmark_hnf_2 + blt rmark_hnf_1 + +rmark_hnf_3: + lwz a1,4-NODE_POINTER_OFFSET(a0) +rmark_hnf_3_: + cmplw 0,sp,d4 + blt rmark_using_reversal_ + + sub d0,a1,d6 + srwi o0,d0,5 + lbzx o1,o4,o0 + rlwinm o2,d0,32-2,29,31 + srw o3,g3,o2 + and. r0,o1,o3 + bne rmark_shared_argument_part + + or o1,o1,o3 + stbx o1,o4,o0 + +rmark_no_shared_argument_part: + slwi d1,d2,2 + stw a0,-4(sp) + addi a3,a0,4 + lwz a0,0(a0) + add a1,a1,d1 + stwu a0,-8(sp) + +rmark_push_hnf_args: + bsubicc d2,1 + + lwz d1,0(a1) + stw a1,-4(sp) + bsubi a1,4 + stwu d1,-8(sp) + + bgt rmark_push_hnf_args + + lwz a0,0(a1) + cmplw a1,a3 + bgt rmark_no_reverse_argument_pointer + + addi a2,a3,3 + stw a0,0(a3) + stw a2,0(a1) + + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmark_next_node + + mr d1,a1 + b rmark_node_ + +rmark_no_reverse_argument_pointer: + mr a3,a1 + b rmark_node + +rmark_shared_argument_part: + cmplw 0,a1,a0 + bgt rmark_hnf_1 + + lwz d1,0-NODE_POINTER_OFFSET(a1) + addi d0,a0,4+2+1 + stw d0,0-NODE_POINTER_OFFSET(a1) + stw d1,4-NODE_POINTER_OFFSET(a0) + b rmark_hnf_1 + +rmark_record: + subic. d2,d2,258 + beq rmark_record_2 + blt rmark_record_1 + +rmark_record_3: + lhz d2,-2+2(d0) + lwz a1,4-NODE_POINTER_OFFSET(a0) + subic. d2,d2,1 + blt rmark_record_3_bb + + beq rmark_record_3_ab + + subic. d2,d2,1 + beq rmark_record_3_aab + + b rmark_hnf_3_ + +rmark_record_3_bb: + subi a0,a0,4 + + sub d0,a1,d6 + setmbit o4,d0,o0,o3,o1,o2,2 + + cmplw a1,a0 + bgt rmark_next_node + + srwi. o3,o3,1 + + lwz o2,0-NODE_POINTER_OFFSET(a1) + addi d0,a0,8+2+1 + stw o2,8-NODE_POINTER_OFFSET(a0) + stw d0,0-NODE_POINTER_OFFSET(a1) + + bne+ rmark_not_next_byte_1 + + addi o0,o0,1 + lbzx o1,o4,o0 + li o3,128 +rmark_not_next_byte_1: + and. r0,o1,o3 + beq+ rmark_not_yet_linked_bb + + sub d0,a0,d6 + addi d0,d0,8 + setmbit o4,d0,o0,o3,o1,o2,2 + b rmark_next_node + +rmark_not_yet_linked_bb: + or o1,o1,o3 + stbx o1,o4,o0 + b rmark_next_node + +rmark_record_3_ab: + sub d0,a1,d6 + setmbit o4,d0,o0,o3,o1,o2,2 + + cmplw 0,a1,a0 + bgt rmark_hnf_1 + + srwi. o3,o3,1 + + lwz o2,0-NODE_POINTER_OFFSET(a1) + addi d0,a0,4+2+1 + stw o2,4-NODE_POINTER_OFFSET(a0) + stw d0,0-NODE_POINTER_OFFSET(a1) + + bne+ rmark_not_next_byte_2 + + addi o0,o0,1 + lbzx o1,o4,o0 + li o3,128 +rmark_not_next_byte_2: + and. r0,o1,o3 + beq+ rmark_not_yet_linked_ab + + sub d0,a0,d6 + addi d0,d0,4 + setmbit o4,d0,o0,o3,o1,o2,2 + b rmark_hnf_1 + +rmark_not_yet_linked_ab: + or o1,o1,o3 + stbx o1,o4,o0 + b rmark_hnf_1 + +rmark_record_3_aab: + cmplw 0,sp,d4 + blt rmark_using_reversal_ + + sub d0,a1,d6 + + tstmbit o4,d0,o0,o3,o1,o2,2 + bne rmark_shared_argument_part + + stw a0,-4(sp) + + srw o3,g3,o2 + + addi a3,a0,4 + lwz a0,0(a0) + + or o1,o1,o3 + stbx o1,o4,o0 + + stwu a0,-8(sp) + + lwz a0,0(a1) + cmplw a1,a3 + bgt rmark_no_reverse_argument_pointer + + addi a2,a3,3 + stw a0,0(a3) + stw a2,0(a1) + + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmark_next_node + + mr d1,a1 + b rmark_node_ + +rmark_record_2: + lhz g1,-2+2(d0) + cmplwi g1,1 + bgt rmark_hnf_2 + beq rmark_hnf_1 + b rmark_next_node + +rmark_record_1: + lhz g1,-2+2(d0) + tst g1 + bne rmark_hnf_1 + b rmark_next_node + +rmark_lazy_node_1: + bne rmark_selector_node_1 + +rmark_hnf_1: + mr a3,a0 + lwz a0,0-NODE_POINTER_OFFSET(a0) + b rmark_node + +rmark_indirection_node: + subi g1,a0,4 + andc o1,o1,o3 + mr a0,a1 + + cmplw g1,d1 + + stbx o1,o4,o0 + stw a1,0(a3) + + bgt rmark_node_d1 + stw d0,0(g1) + b rmark_node_d1 + +rmark_selector_node_1: + baddicc d2,3 + lwz a1,0-NODE_POINTER_OFFSET(a0) + beq rmark_indirection_node + + addic. d2,d2,1 + sub o2,a1,d6 + ble rmark_record_selector_node_1 + + 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 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq rmark_hnf_1 + + lha g1,-2(d2) + cmplwi cr0,g1,2 + ble rmark_small_tuple_or_record + +rmark_large_tuple_or_record: + 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 + + .if NEW_DESCRIPTORS + lwz d0,-8(d0) + andc o1,o1,o3 + lea g1,__indirection + stbx o1,o4,o0 + + lhz d0,4(d0) + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + + cmplwi cr0,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: + lwz g1,-8(d0) + mflr r0 + andc o1,o1,o3 + + lwz g1,4(g1) + subi d2,a0,4 + + stbx o1,o4,o0 + mtctr g1 + mr a0,a1 + mr d3,d1 + stw a3,-4(sp) + stwu r0,-8(sp) + bctrl + lwz a3,0(sp) + addi sp,sp,4 + mtlr r0 + mr d1,d3 + + lea g1,__indirection + stw a0,0(a3) + + 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 + lbzx g1,o4,d2 + rlwinm g2,o2,32-2,29,31 + beq rmark_strict_record_selector_node_1 + + rlwnm. r0,g1,g2,24,24 + bne rmark_hnf_1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq rmark_hnf_1 + + lha g1,-2(d2) + cmplwi cr0,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: + lwz d0,-8(d0) + andc o1,o1,o3 + lea g1,__indirection + stbx o1,o4,o0 + + lhz d0,4(d0) + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + + cmplwi cr0,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 + bne rmark_hnf_1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq rmark_hnf_1 + + lha g1,-2(d2) + cmplwi cr0,g1,258 + ble rmark_select_from_small_record + + 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_select_from_small_record: + lwz g1,-8(d0) + .if ! NEW_DESCRIPTORS + mflr r0 + .endif + subi a0,a0,4 + cmplw a0,d1 + bgt rmark_selector_pointer_not_reversed + + .if NEW_DESCRIPTORS + lhz d0,4(g1) + cmplwi cr0,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 cr0,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) + + stw a0,0(a3) + + mtctr g1 + stw a3,-4(sp) + stwu r0,-8(sp) + bctrl + lwz a3,0(sp) + addi sp,sp,4 + 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 cr0,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 cr0,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: + cmplw a0,d1 + bgt rmark_next_node + + lwz d0,0(a0) + stw d0,0(a3) + addi a3,a3,1 + stw a3,0(a0) + +rmark_next_node: + lwz a0,0(sp) + lwz a3,4(sp) + addi sp,sp,8 + + cmplwi a0,1 + bgt rmark_node + +rmark_next_node_: + blr + +rmark_lazy_node: + beq cr6,rmark_next_node + + bsubicc d2,1 + baddi a0,4 + ble rmark_lazy_node_1 + + cmplwi cr0,d2,255 + bge rmark_closure_with_unboxed_arguments + +rmark_closure_with_unboxed_arguments_: + slwi d1,d2,2 + add a0,a0,d1 + +rmark_push_lazy_args: + bsubicc d2,1 + + lwz d1,0(a0) + stw a0,-4(sp) + bsubi a0,4 + stwu d1,-8(sp) + + bgt rmark_push_lazy_args + + cmplw 0,sp,d4 + + mr a3,a0 + lwz a0,0(a0) + + bge rmark_node + b rmark_using_reversal + +rmark_closure_with_unboxed_arguments: +; baddi d2,1 + srwi d0,d2,8 + bandic d2,255 +; bsub d2,d0 + bsubc d2,d0 +; bsubicc d2,1 + bgt rmark_closure_with_unboxed_arguments_ + beq rmark_hnf_1 + b rmark_next_node + +rmark_hnf_0: + cmpw d0,int_reg + beq rmark_int + + cmplw d0,char_reg + beq rmark_char + blt rmark_no_normal_hnf_0 + + cmplw a0,d1 + + andc o1,o1,o3 + subi a1,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET + stbx o1,o4,o0 + stw a1,0(a3) + + bgt rmark_next_node + stw d0,0(a0) + b rmark_next_node + +rmark_int: + lwz d2,4-NODE_POINTER_OFFSET(a0) + cmplwi cr0,d2,33 + bge rmark_next_node + + lea a1,small_integers + andc o1,o1,o3 + slwi d2,d2,3 + + stbx o1,o4,o0 + add a1,a1,d2 + + cmplw a0,d1 + + stw a1,0(a3) + + bgt rmark_next_node + stw d0,0(a0) + b rmark_next_node + +rmark_char: + andc o1,o1,o3 + lbz d2,7-NODE_POINTER_OFFSET(a0) + + lea a1,static_characters + stbx o1,o4,o0 + slwi d2,d2,3 + + add a1,a1,d2 + + cmplw a0,d1 + + stw a1,0(a3) + + bgt rmark_next_node + stw d0,0(a0) + b rmark_next_node + +rmark_no_normal_hnf_0: + lea g0,__ARRAY__2 + cmplw 0,d0,g0 + bne+ rmark_next_node + +rmark_array: + lwz g1,8-NODE_POINTER_OFFSET(a0) + tst g1 + beq rmark_lazy_array + + lhz d0,-2(g1) + tst d0 + beq rmark_b_array + + lhz g1,-2+2(g1) + subi d0,d0,256 + tst g1 + beq rmark_b_array + + cmplw 0,sp,d4 + blt rmark_array_using_reversal + + cmpw cr0,d0,g1 + mr d1,g1 + beq rmark_a_record_array + +rmark_ab_record_array: + mr o2,d2 + mr o3,d3 + + lwz d2,4-NODE_POINTER_OFFSET(a0) + addi a0,a0,8 + stw a0,-4(sp) + + slwi d2,d2,2 + mullw a1,d2,d0 + + sub d0,d0,d1 + addi a0,a0,4 + add a1,a1,a0 + + mflr r0 + stw r0,-8(sp) + bl reorder2 + lwz r0,-8(sp) + lwz a0,-4(sp) + mtlr r0 + + lwz d0,-4(a0) + mullw d0,d0,d1 + + mr d3,o3 + mr d2,o2 + b rmark_lr_array + +rmark_b_array: + sub d0,a0,d6 + addi d0,d0,4 + setmbit o4,d0,o0,o3,o1,o2,2 + b rmark_next_node + +rmark_a_record_array: + lwz d0,4-NODE_POINTER_OFFSET(a0) + addi a0,a0,8 + mullw d0,d0,d1 + b rmark_lr_array + +rmark_lazy_array: + cmplw 0,sp,d4 + blt rmark_array_using_reversal + + lwz d0,4-NODE_POINTER_OFFSET(a0) + addi a0,a0,8 +rmark_lr_array: + sub d1,a0,d6 + srwi d1,d1,2 + add d1,d1,d0 + setmbit o4,d1,o0,o3,o1,o2,0 + + cmplwi cr0,d0,1 + ble rmark_array_length_0_1 + + mr a1,a0 + slwi d0,d0,2 + add a0,a0,d0 + + lwz d2,0-NODE_POINTER_OFFSET(a0) + lwz o0,0-NODE_POINTER_OFFSET(a1) + stw d2,0-NODE_POINTER_OFFSET(a1) + stw o0,0-NODE_POINTER_OFFSET(a0) + + lwzu d2,-4-NODE_POINTER_OFFSET(a0) + lwzu o0,-4-NODE_POINTER_OFFSET(a1) + stw o0,0-NODE_POINTER_OFFSET(a0) + stw d2,0-NODE_POINTER_OFFSET(a1) + + mflr r0 + .if 0 + stw a4,-4(sp) + mr a4,a0 + .else + stw a0,-4(sp) + .endif + mr a3,a1 + stwu r0,-8(sp) + b rmark_array_nodes_ + +rmark_array_nodes1: + cmplw 0,a0,a3 + bgt rmark_next_array_node + + lwz d1,0(a0) + addi d0,a3,1 + stw d1,0(a3) + stw d0,0(a0) + +rmark_next_array_node: + .if 0 + addi a3,a3,4 + cmpw cr0,a4,a3 + .else + lwz d0,4(sp) + addi a3,a3,4 + cmpw cr0,d0,a3 + .endif + beq end_rmark_array_nodes + +rmark_array_nodes_: + lwz a0,0(a3) + + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmark_next_array_node + + srwi o0,d0,5 + lbzx o1,o4,o0 + rlwinm o2,d0,32-2,29,31 + rlwnm. r0,o1,o2,24,24 + bne- rmark_array_nodes1 + + srw o3,g3,o2 + + lwz d0,0(a0) + li g1,1 + stw a3,-4(sp) + + or o1,o1,o3 + + stwu g1,-8(sp) + + stbx o1,o4,o0 + + mr d1,a3 + bl rmark_arguments + + .if 0 + addi a3,a3,4 + cmpw cr0,a4,a3 + .else + lwz d0,4(sp) + addi a3,a3,4 + cmpw cr0,d0,a3 + .endif + bne rmark_array_nodes_ + +end_rmark_array_nodes: + lwz r0,0(sp) + .if 0 + lwz a4,4(sp) + .endif + addi sp,sp,8 + mtlr r0 + b rmark_next_node + +rmark_array_length_0_1: + subi a0,a0,8 + blt rmark_next_node + + lwz d1,12-NODE_POINTER_OFFSET(a0) + lwz o0,8-NODE_POINTER_OFFSET(a0) + lwz o1,4-NODE_POINTER_OFFSET(a0) + stw o0,12-NODE_POINTER_OFFSET(a0) + stw o1,8-NODE_POINTER_OFFSET(a0) + stwu d1,4-NODE_POINTER_OFFSET(a0) + b rmark_hnf_1 + +reorder2: + mr d2,d0 + mr d3,d1 + slwi g0,d0,2 + slwi g1,d1,2 + add a0,a0,g1 + sub a1,a1,g0 + b st_reorder_lp2 + +reorder_lp2: + lwzu o0,-4(a1) + subic. d2,d2,1 + + lwz o1,0(a0) + stw o0,0(a0) + addi a0,a0,4 + + bne+ next_b_in_element2 + mr d2,d0 + add a0,a0,g1 +next_b_in_element2: + + subic. d3,d3,1 + stw o1,0(a1) + + bne+ next_a_in_element2 + mr d3,d1 + sub a1,a1,g0 +next_a_in_element2: + +st_reorder_lp2: + cmplw 1,a1,a0 + bgt cr1,reorder_lp2 + + blr diff --git a/macho/pcompact_rmarkr.a b/macho/pcompact_rmarkr.a new file mode 100644 index 0000000..4ed8d52 --- /dev/null +++ b/macho/pcompact_rmarkr.a @@ -0,0 +1,856 @@ + +rmark_using_reversal: + stw a3,-4(sp) + li d3,0 + li d5,1 + stwu a3,-8(sp) + b rmarkr_node + +rmark_using_reversal_: + subi a0,a0,4 + stw d1,-4(sp) + cmplw 0,a0,d1 + stwu a3,-8(sp) + bgt rmark_no_undo_reverse_1 + stw a0,0(a3) + stw d0,0(a0) +rmark_no_undo_reverse_1: + li d3,0 + li d5,1 + b rmarkr_arguments + +rmark_array_using_reversal: + stw d1,-4(sp) + cmplw 0,a0,d1 + stwu a3,-8(sp) + bgt rmark_no_undo_reverse_2 + lea d0,__ARRAY__2 + stw a0,0(a3) + stw d0,0(a0) +rmark_no_undo_reverse_2: + li d3,0 + li d5,1 + b rmarkr_arguments + +rmarkr_hnf_2: + lwz o0,0-NODE_POINTER_OFFSET(a0) + or d3,d3,d5 + ori o0,o0,2 + stw o0,0-NODE_POINTER_OFFSET(a0) + lwzu d2,4-NODE_POINTER_OFFSET(a0) + stw d3,0-NODE_POINTER_OFFSET(a0) + mr d3,a0 + li d5,0 + mr a0,d2 + +rmarkr_node: + sub d0,a0,d6 + cmplw 0,d0,d7 + bge- rmarkr_next_node_after_static + + srwi o0,d0,5 + lbzx o1,o4,o0 + rlwinm o2,d0,32-2,29,31 + rlwnm. r0,o1,o2,24,24 + bne rmarkr_next_node + +rmarkr_arguments: + lwz d0,0-NODE_POINTER_OFFSET(a0) + srw o3,g3,o2 + + or o1,o1,o3 + + andi. r0,d0,2 + lha d2,-2(d0) + + stbx o1,o4,o0 + + cmpwi cr6,d2,0 + beq rmarkr_lazy_node + + beq cr6,rmarkr_hnf_0 + + cmplwi cr0,d2,256 + addi a0,a0,4 + bge rmarkr_record + + subic. d2,d2,2 + beq rmarkr_hnf_2 + blt rmarkr_hnf_1 + +rmarkr_hnf_3: + lwz a1,4-NODE_POINTER_OFFSET(a0) +rmarkr_hnf_3_: + sub d0,a1,d6 + srwi o0,d0,5 + lbzx o1,o4,o0 + rlwinm o2,d0,32-2,29,31 + srw o3,g3,o2 + and. r0,o1,o3 + bne rmarkr_shared_argument_part + + or o1,o1,o3 + stbx o1,o4,o0 + +rmarkr_no_shared_argument_part: + lwz o0,0-NODE_POINTER_OFFSET(a0) + or d3,d3,d5 + ori o0,o0,2 + stw o0,0-NODE_POINTER_OFFSET(a0) + stwu d3,4-NODE_POINTER_OFFSET(a0) + + lwz o0,0-NODE_POINTER_OFFSET(a1) + slwi d2,d2,2 + ori o0,o0,1 + stw o0,0-NODE_POINTER_OFFSET(a1) + + lwzux d2,a1,d2 + li d5,0 + stw a0,0-NODE_POINTER_OFFSET(a1) + mr d3,a1 + mr a0,d2 + b rmarkr_node + +rmarkr_shared_argument_part: + cmplw 0,a1,a0 + bgt rmarkr_hnf_1 + + lwz o0,0-NODE_POINTER_OFFSET(a1) + addi d0,a0,4+2+1 + stw d0,0-NODE_POINTER_OFFSET(a1) + stw o0,4-NODE_POINTER_OFFSET(a0) + b rmarkr_hnf_1 + +rmarkr_lazy_node_1: + bne rmarkr_selector_node_1 + +rmarkr_hnf_1: + lwz d2,0-NODE_POINTER_OFFSET(a0) + or d3,d3,d5 + stw d3,0-NODE_POINTER_OFFSET(a0) + mr d3,a0 + li d5,2 + mr a0,d2 + b rmarkr_node + +rmarkr_selector_node_1: + baddicc d2,3 + lwz a1,0-NODE_POINTER_OFFSET(a0) + beq rmarkr_indirection_node + + addic. d2,d2,1 + sub o2,a1,d6 + ble rmarkr_record_selector_node_1 + + 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 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq rmarkr_hnf_1 + + lha g1,-2(d2) + cmplwi cr0,g1,2 + ble rmarkr_small_tuple_or_record + +rmarkr_large_tuple_or_record: + 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 + + .if NEW_DESCRIPTORS + lwz d0,-8(d0) + andc o1,o1,o3 + lea g1,__indirection + stbx o1,o4,o0 + + lhz d0,4(d0) + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + + cmplwi cr0,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: + lwz g1,-8(d0) + mflr r0 + andc o1,o1,o3 + + lwz g1,4(g1) + subi d2,a0,4 + + mtlr g1 + stbx o1,o4,o0 + mr a0,a1 + stwu r0,-4(sp) + blrl + mtlr r0 + + lea g1,__indirection + 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 + lbzx g1,o4,d2 + rlwinm g2,o2,32-2,29,31 + beq rmarkr_strict_record_selector_node_1 + + rlwnm. r0,g1,g2,24,24 + bne rmarkr_hnf_1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq rmarkr_hnf_1 + + lha g1,-2(d2) + cmplwi cr0,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: + lwz d0,-8(d0) + andc o1,o1,o3 + lea g1,__indirection + stbx o1,o4,o0 + + lhz d0,4(d0) + stw g1,-4-NODE_POINTER_OFFSET(a0) + subi d2,a0,4 + + cmplwi cr0,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 + bne rmarkr_hnf_1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq rmarkr_hnf_1 + + lha g1,-2(d2) + cmplwi cr0,g1,258 + ble rmarkr_select_from_small_record + + 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_select_from_small_record: + .if NEW_DESCRIPTORS + lwz g1,-8(d0) + subi a0,a0,4 + lhz d0,4(g1) + cmplwi cr0,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 cr0,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 + lwz g1,-8(d0) + mflr r0 + subi a0,a0,4 + lwz g1,4(g1) + + mtlr g1 + stwu r0,-4(sp) + blrl + mtlr r0 + .endif + b rmarkr_next_node + +rmarkr_indirection_node: + andc o1,o1,o3 + stbx o1,o4,o0 + + mr a0,a1 + b rmarkr_node + +rmarkr_next_node: + cmpwi cr0,d5,0 + bne rmarkr_parent + + lwzu d2,-4-NODE_POINTER_OFFSET(d3) + lwz o0,4-NODE_POINTER_OFFSET(d3) + andi. d5,d2,3 + + cmpwi cr0,d5,3 + beq rmarkr_argument_part_cycle1 + + stw o0,0-NODE_POINTER_OFFSET(d3) + +rmarkr_c_argument_part_cycle1: + cmplw 0,a0,d3 + bgt rmarkr_no_reverse_1 + + lwz o0,0-NODE_POINTER_OFFSET(a0) + addi d0,d3,4+1 + stw o0,4-NODE_POINTER_OFFSET(d3) + stw d0,0-NODE_POINTER_OFFSET(a0) + clrrwi a0,d2,2 + b rmarkr_node + +rmarkr_no_reverse_1: + stw a0,4-NODE_POINTER_OFFSET(d3) + clrrwi a0,d2,2 + b rmarkr_node + +rmarkr_lazy_node: + beq cr6,rmarkr_next_node + + bsubicc d2,1 + baddi a0,4 + ble rmarkr_lazy_node_1 + + cmplwi cr0,d2,255 + bge rmarkr_closure_with_unboxed_arguments + +rmarkr_closure_with_unboxed_arguments_: + lwz o0,0-NODE_POINTER_OFFSET(a0) + slwi d2,d2,2 + ori o0,o0,2 + stw o0,0(a0) + + lwzux d2,a0,d2 + or d3,d3,d5 + stw d3,0-NODE_POINTER_OFFSET(a0) + mr d3,a0 + li d5,0 + mr a0,d2 + b rmarkr_node + +rmarkr_closure_with_unboxed_arguments: +; baddi d2,1 + srwi d0,d2,8 + bandic d2,255 +; bsub d2,d0 + bsubc d2,d0 +; bsubicc d2,1 + bgt rmarkr_closure_with_unboxed_arguments_ + beq rmarkr_hnf_1 + bsubi a0,4 + b rmarkr_next_node + +rmarkr_hnf_0: + cmpw d0,int_reg + bne rmarkr_no_int_3 + + lwz d2,4-NODE_POINTER_OFFSET(a0) + cmplwi cr0,d2,33 + bge rmarkr_next_node + + andc o1,o1,o3 + stbx o1,o4,o0 + + lea a0,small_integers + slwi d2,d2,3 + add a0,a0,d2 + b rmarkr_next_node_after_static + +rmarkr_no_int_3: + cmplw d0,char_reg + bne rmarkr_no_char_3 + + andc o1,o1,o3 + stbx o1,o4,o0 + + lbz d2,7-NODE_POINTER_OFFSET(a0) + lea a0,static_characters + slwi d2,d2,3 + add a0,a0,d2 + b rmarkr_next_node_after_static + +rmarkr_no_char_3: + blt rmarkr_no_normal_hnf_0 + + subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET + + andc o1,o1,o3 + stbx o1,o4,o0 + b rmarkr_next_node_after_static + +rmarkr_no_normal_hnf_0: + lea o0,__ARRAY__2 + cmplw 0,d0,o0 + bne+ rmarkr_next_node + b rmarkr_array + +rmarkr_record: + subic. d2,d2,258 + beq rmarkr_record_2 + blt rmarkr_record_1 + +rmarkr_record_3: + lhz d2,-2+2(d0) + lwz a1,4-NODE_POINTER_OFFSET(a0) + subic. d2,d2,1 + blt rmarkr_record_3_bb + + beq rmarkr_record_3_ab + + subic. d2,d2,1 + beq rmarkr_record_3_aab + + b rmarkr_hnf_3_ + +rmarkr_record_3_bb: + subi a0,a0,4 + + sub d0,a1,d6 + setmbit o4,d0,d1,o0,o1,o2,2 + + cmplw a1,a0 + bgt rmarkr_next_node + + srwi. o0,o0,1 + + lwz o2,0-NODE_POINTER_OFFSET(a1) + addi d0,a0,8+2+1 + stw o2,8-NODE_POINTER_OFFSET(a0) + stw d0,0-NODE_POINTER_OFFSET(a1) + + bne+ rmarkr_not_next_byte_1 + + addi d1,d1,1 + lbzx o1,o4,d1 + li o0,128 +rmarkr_not_next_byte_1: + and. r0,o1,o0 + beq+ rmarkr_not_yet_linked_bb + + sub d0,a0,d6 + addi d0,d0,8 + setmbit o4,d0,d1,o0,o1,o2,2 + b rmarkr_next_node + +rmarkr_not_yet_linked_bb: + or o1,o1,o0 + stbx o1,o4,d1 + b rmarkr_next_node + +rmarkr_record_3_ab: + sub d0,a1,d6 + setmbit o4,d0,d1,o0,o1,o2,2 + + cmplw 0,a1,a0 + bgt rmarkr_hnf_1 + + srwi. o0,o0,1 + + lwz o2,0-NODE_POINTER_OFFSET(a1) + addi d0,a0,4+2+1 + stw o2,4-NODE_POINTER_OFFSET(a0) + stw d0,0-NODE_POINTER_OFFSET(a1) + + bne+ rmarkr_not_next_byte_2 + + addi d1,d1,1 + lbzx o1,o4,d1 + li o0,128 +rmarkr_not_next_byte_2: + and. r0,o1,o0 + beq+ rmarkr_not_yet_linked_ab + + sub d0,a0,d6 + addi d0,d0,4 + setmbit o4,d0,d1,o0,o1,o2,2 + b rmarkr_hnf_1 + +rmarkr_not_yet_linked_ab: + or o1,o1,o0 + stbx o1,o4,d1 + b rmarkr_hnf_1 + +rmarkr_record_3_aab: + sub d0,a1,d6 + + tstmbit o4,d0,d1,o0,o1,o2,2 + bne rmarkr_shared_argument_part + + srw o0,g3,o2 + or o1,o1,o0 + stbx o1,o4,d1 + + lwz o0,0-NODE_POINTER_OFFSET(a0) + or d3,d3,d5 + ori o0,o0,2 + stw o0,0-NODE_POINTER_OFFSET(a0) + stwu d3,4-NODE_POINTER_OFFSET(a0) + + lwz d2,0-NODE_POINTER_OFFSET(a1) + li d5,1 + stw a0,0-NODE_POINTER_OFFSET(a1) + mr d3,a1 + mr a0,d2 + b rmarkr_node + +rmarkr_record_2: + lhz g1,-2+2(d0) + cmplwi g1,1 + bgt rmarkr_hnf_2 + beq rmarkr_hnf_1 + + subi a0,a0,4 + b rmarkr_next_node + +rmarkr_record_1: + lhz g1,-2+2(d0) + tst g1 + bne rmarkr_hnf_1 + + subi a0,a0,4 + b rmarkr_next_node + +rmarkr_array: + lwz d1,8-NODE_POINTER_OFFSET(a0) + tst d1 + beq rmarkr_lazy_array + + lhz d0,-2(d1) + tst d0 + beq rmarkr_b_record_array + + lhz d1,-2+2(d1) + tst d1 + beq rmarkr_b_record_array + + subi d0,d0,256 + cmpw cr0,d0,d1 + beq rmarkr_a_record_array + +rmarkr_ab_record_array: + mr o2,d2 + mr o3,d3 + + lwz d2,4-NODE_POINTER_OFFSET(a0) + addi a0,a0,8 + stw a0,-4(sp) + + slwi d2,d2,2 + mullw a1,d2,d0 + + sub d0,d0,d1 + addi a0,a0,4 + add a1,a1,a0 + + mflr r0 + stw r0,-8(sp) + bl reorder2 + lwz r0,-8(sp) + + lwz a0,-4(sp) + mtlr r0 + + lwz d0,-4(a0) + mullw d0,d0,d1 + + mr d3,o3 + mr d2,o2 + b rmarkr_lr_array + +rmarkr_b_record_array: + sub d0,a0,d6 + addi d0,d0,4 + setmbit o4,d0,d1,o0,o1,o2,2 + b rmarkr_next_node + +rmarkr_a_record_array: + lwz d0,4-NODE_POINTER_OFFSET(a0) + addi a0,a0,8 + mullw d0,d0,d1 + b rmarkr_lr_array + +rmarkr_lazy_array: + lwz d0,4-NODE_POINTER_OFFSET(a0) + addi a0,a0,8 +rmarkr_lr_array: + sub d1,a0,d6 + srwi d1,d1,2 + add d1,d1,d0 + setmbit o4,d1,d2,o0,o1,o2,0 + + cmplwi cr0,d0,1 + ble rmarkr_array_length_0_1 + + mr a1,a0 + slwi d0,d0,2 + add a0,a0,d0 + + lwz d2,0-NODE_POINTER_OFFSET(a0) + lwz o0,0-NODE_POINTER_OFFSET(a1) + stw d2,0-NODE_POINTER_OFFSET(a1) + stw o0,0-NODE_POINTER_OFFSET(a0) + + lwzu d2,-4-NODE_POINTER_OFFSET(a0) + lwzu o0,-4-NODE_POINTER_OFFSET(a1) + addi d2,d2,2 + stw o0,0-NODE_POINTER_OFFSET(a0) + stw d2,0-NODE_POINTER_OFFSET(a1) + + lwzu d2,-4-NODE_POINTER_OFFSET(a0) + or d3,d3,d5 + stw d3,0-NODE_POINTER_OFFSET(a0) + mr d3,a0 + li d5,0 + mr a0,d2 + b rmarkr_node + +rmarkr_array_length_0_1: + subi a0,a0,8 + blt rmarkr_next_node + + lwz d1,12-NODE_POINTER_OFFSET(a0) + lwz o0,8-NODE_POINTER_OFFSET(a0) + lwz o1,4-NODE_POINTER_OFFSET(a0) + stw o0,12-NODE_POINTER_OFFSET(a0) + stw o1,8-NODE_POINTER_OFFSET(a0) + stwu d1,4-NODE_POINTER_OFFSET(a0) + b rmarkr_hnf_1 + +rmarkr_parent: + tst d3 + beq end_rmarkr + + subic. d5,d5,1 + beq rmarkr_argument_part_parent + + cmplw a0,d3 + lwz d2,0-NODE_POINTER_OFFSET(d3) + bgt rmarkr_no_reverse_2 + + mr a1,a0 + addi d0,d3,1 + lwz a0,0-NODE_POINTER_OFFSET(a1) + stw d0,0-NODE_POINTER_OFFSET(a1) + +rmarkr_no_reverse_2: + stw a0,0-NODE_POINTER_OFFSET(d3) + subi a0,d3,4 + andi. d5,d2,3 + clrrwi d3,d2,2 + b rmarkr_next_node + +rmarkr_argument_part_parent: + mr a1,d3 + mr d3,a0 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + + mr a0,a1 + +rmarkr_skip_upward_pointers: + andi. d0,d2,3 + cmpwi cr0,d0,3 + bne rmarkr_no_upward_pointer + + clrrwi a1,d2,2 + lwz d2,0-NODE_POINTER_OFFSET(a1) + b rmarkr_skip_upward_pointers + +rmarkr_no_upward_pointer: + cmplw 0,d3,a0 + bgt rmarkr_no_reverse_3 + + mr o0,d3 + lwz d3,0-NODE_POINTER_OFFSET(d3) + addi d0,a0,1 + stw d0,0-NODE_POINTER_OFFSET(o0) + +rmarkr_no_reverse_3: + stw d3,0-NODE_POINTER_OFFSET(a1) + + clrrwi d3,d2,2 + + lwzu d2,-4-NODE_POINTER_OFFSET(d3) + + cmplw 6,a0,d3 + + lwz o0,4-NODE_POINTER_OFFSET(d3) + andi. d5,d2,3 + stw o0,0-NODE_POINTER_OFFSET(d3) + + bgt cr6,rmarkr_no_reverse_4 + + lwz o0,0-NODE_POINTER_OFFSET(a0) + stw o0,4-NODE_POINTER_OFFSET(d3) + addi d0,d3,4+2+1 + stw d0,0-NODE_POINTER_OFFSET(a0) + clrrwi a0,d2,2 + b rmarkr_node + +rmarkr_no_reverse_4: + stw a0,4-NODE_POINTER_OFFSET(d3) + clrrwi a0,d2,2 + b rmarkr_node + +rmarkr_argument_part_cycle1: + mr d1,a1 + +rmarkr_skip_pointer_list1: + clrrwi a1,d2,2 + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. d5,d2,3 + cmpwi cr0,d5,3 + beq rmarkr_skip_pointer_list1 + + stw o0,0-NODE_POINTER_OFFSET(a1) + mr a1,d1 + b rmarkr_c_argument_part_cycle1 + +rmarkr_next_node_after_static: + cmpwi cr0,d5,0 + bne rmarkr_parent_after_static + + lwzu d2,-4-NODE_POINTER_OFFSET(d3) + lwz o0,4-NODE_POINTER_OFFSET(d3) + andi. d5,d2,3 + + cmpwi cr0,d5,3 + beq rmarkr_argument_part_cycle2 + + stw o0,0-NODE_POINTER_OFFSET(d3) + +rmarkr_c_argument_part_cycle2: + stw a0,4-NODE_POINTER_OFFSET(d3) + clrrwi a0,d2,2 + b rmarkr_node + +rmarkr_parent_after_static: + cmpwi cr0,d3,0 + beq end_rmarkr_after_static + + subic. d5,d5,1 + beq rmarkr_argument_part_parent_after_static + + lwz d2,0-NODE_POINTER_OFFSET(d3) + stw a0,0-NODE_POINTER_OFFSET(d3) + subi a0,d3,4 + andi. d5,d2,3 + clrrwi d3,d2,2 + b rmarkr_next_node + +rmarkr_argument_part_parent_after_static: + mr a1,d3 + mr d3,a0 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + + mr a0,a1 + +rmarkr_skip_upward_pointers_2: + andi. d0,d2,3 + cmpwi cr0,d0,3 + bne rmarkr_no_reverse_3 + + clrrwi a1,d2,2 + lwz d2,0-NODE_POINTER_OFFSET(a1) + b rmarkr_skip_upward_pointers_2 + +rmarkr_argument_part_cycle2: + mr d1,a1 + +rmarkr_skip_pointer_list2: + clrrwi a1,d2,2 + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. d5,d2,3 + cmpwi cr0,d5,3 + beq rmarkr_skip_pointer_list2 + + stw o0,0-NODE_POINTER_OFFSET(a1) + mr a1,d1 + b rmarkr_c_argument_part_cycle2 + +end_rmarkr_after_static: + lwz a3,0(sp) + addi sp,sp,8 + stw a0,0(a3) + b rmarkr_next_stack_node + +end_rmarkr: + lwz d1,4(sp) + lwz a3,0(sp) + cmplw 0,a0,d1 + addi sp,sp,8 + bgt rmarkr_no_reverse_5 + mr a1,a0 + addi d0,a3,1 + lwz a0,0(a0) + stw d0,0(a1) +rmarkr_no_reverse_5: + stw a0,0(a3) + +rmarkr_next_stack_node: + cmplw 0,sp,d4 + bge rmark_next_node + + lwz a0,0(sp) + lwz a3,4(sp) + addi sp,sp,8 + + cmplwi a0,1 + bgt rmark_using_reversal + b rmark_next_node_ diff --git a/macho/pcopy.a b/macho/pcopy.a index 478431a..dccd663 100644 --- a/macho/pcopy.a +++ b/macho/pcopy.a @@ -119,18 +119,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 @@ -144,11 +152,14 @@ copy_record_arguments_3: cmpwi cr6,,d1,0 .endif baddi d5,2+1 + .if 1 + subi d6,d1,1 + .else beq cr6,copy_record_arguments_3b subic. d6,d1,1 beq copy_record_arguments_3abb - + .endif slwi d5,d5,2 add d4,a2,d5 @@ -162,6 +173,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 @@ -175,6 +187,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: @@ -305,13 +318,22 @@ in_hnf_2: lhz d2,-2(d0) beq copy_arity_0_node2 cmplwi cr6,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 cr6,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 @@ -508,8 +530,277 @@ already_copied_2_: bge cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 cr5,copy_lp2 + blr + .endif + + + .else copy_record_2: subic. d2,d2,258 lwz o0,4-NODE_POINTER_OFFSET(a1) @@ -523,23 +814,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 cr5,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 cr5,copy_lp2 blr @@ -547,7 +838,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) @@ -559,32 +850,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 @@ -594,20 +885,21 @@ cp_record_arg_lp2: bge cr5,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 cr5,copy_lp2 blr + .endif .endif not_in_hnf_2: @@ -716,10 +1008,6 @@ copy_selector_2: beq copy_indirection_2 mr a0,d0 - -; .if no selectors -; b copy_arity_1_node2_ - blt copy_record_selector_2 lwz d2,-8(a0) @@ -733,11 +1021,60 @@ copy_selector_2: cmplwi cr0,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 cr0,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_: + 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_: lwz g1,4(d2) @@ -757,6 +1094,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 cr0,d2,-2-3 @@ -772,18 +1110,63 @@ copy_record_selector_2: lha g1,-2(d1) cmplwi cr0,g1,258 + .if NEW_DESCRIPTORS + ble copy_record_selector_2_ + .else ble copy_selector_2_ + .endif + + .if 1 + lhz g1,-2+2(d1) + cmplwi cr0,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 cr0,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) @@ -795,17 +1178,57 @@ copy_strict_record_selector_2: cmplwi cr0,g1,258 ble copy_strict_record_selector_2_ - .if COPIED_VECTOR + .if 1 + lhz g1,-2+2(d1) + cmplwi cr0,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 NEW_DESCRIPTORS + lhz d0,4(d2) + cmplwi cr0,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 cr0,d0,0 + beq copy_strict_record_selector_6 + cmplwi cr0,d0,8 + 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 mr d0,a1 lwz g1,4(d2) mr a1,a0 @@ -821,6 +1244,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 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 diff --git a/macho/pstartup.a b/macho/pstartup.a index bd2c6b7..90c323a 100644 --- a/macho/pstartup.a +++ b/macho/pstartup.a @@ -118,8 +118,8 @@ WRITE_HEAP = 0 WRITE_HEAP = 0 STDERR_TO_FILE = 1 .endif +NEW_DESCRIPTORS = 1 ; PROFILE = 0 -UNBOXED_CLOSURES = 1 MODULE_NAMES_IN_TIME_PROFILER = 1 @@ -129,7 +129,11 @@ MINIMUM_HEAP_SIZE = 8000 .if 1 DESCRIPTOR_ARITY_OFFSET = (-2) + .if NEW_DESCRIPTORS +ZERO_ARITY_DESCRIPTOR_OFFSET = (-4) + .else ZERO_ARITY_DESCRIPTOR_OFFSET = (-8) + .endif .else DESCRIPTOR_ARITY_OFFSET = (-8) ZERO_ARITY_DESCRIPTOR_OFFSET = (-12) @@ -607,7 +611,7 @@ _abc_main: .else addi sp,sp,64 .endif - cmpwi 0,o0,0 + cmpwi cr0,o0,0 beq no_memory_1 lea o1,heap_mbp @@ -633,7 +637,7 @@ _abc_main: .endif addi sp,sp,64 - cmpwi 0,o0,0 + cmpwi cr0,o0,0 beq no_memory_1 mr a4,o0 @@ -668,7 +672,7 @@ make_small_integers_lp: stw d1,0(a0) stw d0,4(a0) addi d0,d0,1 - cmpwi 0,d0,33 + cmpwi cr0,d0,33 addi a0,a0,8 bne make_small_integers_lp @@ -679,7 +683,7 @@ make_static_characters_lp: stw d1,0(a0) stw d0,4(a0) addi d0,d0,1 - cmpwi 0,d0,256 + cmpwi cr0,d0,256 addi a0,a0,8 bne make_static_characters_lp @@ -1074,7 +1078,7 @@ no_memory_1: print_sc: lea o0,basic_only lwz o1,0(o0) - cmpwi 0,o1,0 + cmpwi cr0,o1,0 bne end_print print_: mr o0,d0 @@ -1132,41 +1136,54 @@ print_symbol_sc: print_symbol_2: lwz d0,0(a0) - cmpw 0,int_reg,d0 + cmpw cr0,int_reg,d0 beq print_int_node - cmpw 0,char_reg,d0 + cmpw cr0,char_reg,d0 beq print_char_node - cmpw 0,bool_reg,d0 + cmpw cr0,bool_reg,d0 beq print_bool - cmpw 0,real_reg,d0 + cmpw cr0,real_reg,d0 beq print_real_node - cmpwi 0,d1,0 + cmpwi cr0,d1,0 bne end_print_symbol -printD_: lha d1,-2(d0) +printD_: + lha d1,-2(d0) + .if NEW_DESCRIPTORS + cmplwi cr0,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 + cmplwi cr0,d1,256 bge print_record slwi d1,d1,3 sub a2,a2,d1 - .if 1 lhz d1,DESCRIPTOR_ARITY_OFFSET(a2) addi a2,a2,4 slwi d1,d1,3 add a2,a2,d1 b print_string_a2 - .endif print_record: lwz a2,-4(a2) b print_string_a2 + .endif end_print_symbol: lwz r0,0(sp) @@ -1212,13 +1229,13 @@ print_int: print_char: lea o0,basic_only lwz d1,0(o0) - cmpwi 0,d1,0 + cmpwi cr0,d1,0 bne print_char_node_bo b print_char_node_sc print_char_node: - cmpwi 0,d1,0 + cmpwi cr0,d1,0 lwz d0,4(a0) bne print_char_node_sc print_char_node_bo: @@ -1284,7 +1301,7 @@ print_char_node_sc: print_bool: lbz o0,7(a0) - cmpwi 0,o0,0 + cmpwi cr0,o0,0 beq print_false print_true: @@ -1362,7 +1379,7 @@ print_string_a2: print__chars__sc: lea o0,basic_only lwz d1,0(o0) - cmpwi 0,d1,0 + cmpwi cr0,d1,0 bne no_print_chars print__string__: @@ -1473,16 +1490,26 @@ eprint__string__: .text ; __TEXT.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 cr0,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 + cmplwi cr0,d1,256 bge eprint_record slwi d1,d1,3 @@ -1492,10 +1519,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) @@ -1533,20 +1565,30 @@ eprint_string_a2: .text ; __TEXT.DtoAC: -DtoAC: lha d1,-2(d0) +DtoAC: + lha d1,-2(d0) + .if NEW_DESCRIPTORS + cmplwi cr0,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 + cmplwi cr0,d1,256 bge DtoAC_record 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 @@ -1585,7 +1627,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 .text @@ -1648,7 +1694,7 @@ push_t_r_args: sub d2,d3,d1 slwi d4,d3,2 - cmplwi 0,d3,2 + cmplwi cr0,d3,2 add a1,a0,d4 ble small_record @@ -1757,7 +1803,7 @@ RtoAC: ItoAC: .if MY_ITOS lea a0,sprintf_buffer - cmpwi 0,d0,0 + cmpwi cr0,d0,0 bge no_minus li o0,45 @@ -1770,7 +1816,7 @@ no_minus: beq zero_digit calculate_digits: - cmplwi 0,d0,10 + cmplwi cr0,d0,10 blt last_digit #if 1 @@ -1797,11 +1843,10 @@ calculate_digits: stb a1,0(a2) addi a2,a2,1 - b calculate_digits last_digit: - cmpwi 0,d0,0 + cmpwi cr0,d0,0 beq no_zero zero_digit: addi d0,d0,48 @@ -1812,7 +1857,7 @@ no_zero: reverse_digits: lbzu d1,-1(a2) - cmpw 0,a2,a1 + cmpw cr0,a2,a1 stb d1,0(a0) addi a0,a0,1 bne reverse_digits @@ -1896,19 +1941,19 @@ D_to_S_cp_str_2: eqD: lwz d0,0(a0) lwz o0,0(a1) - cmpw 0,d0,o0 + cmpw cr0,d0,o0 bne eqD_false - cmpw 0,d0,int_reg + cmpw cr0,d0,int_reg beq eqD_INT - cmpw 0,d0,char_reg + cmpw cr0,d0,char_reg beq eqD_CHAR - cmpw 0,d0,bool_reg + cmpw cr0,d0,bool_reg beq eqD_BOOL - cmpw 0,d0,real_reg + cmpw cr0,d0,real_reg beq eqD_REAL li d0,-1 @@ -1921,7 +1966,7 @@ eqD_CHAR: eqD_INT: lwz d1,4(a0) lwz o0,4(a1) li d0,0 - cmpw 0,d1,o0 + cmpw cr0,d1,o0 mfcr d0 srwi d0,d0,31-2 @@ -1934,7 +1979,7 @@ eqD_INT: lwz d1,4(a0) eqD_BOOL: lbz d1,7(a0) lbz o0,7(a1) li d0,0 - cmpw 0,d1,o0 + cmpw cr0,d1,o0 mfcr d0 srwi d0,d0,31-2 @@ -2485,7 +2530,7 @@ no_mark3: stw d6,24(sp) extsb o0,o0 - cmpwi 0,o0,0 + cmpwi cr0,o0,0 ble collect subi o0,o0,2 @@ -2769,7 +2814,7 @@ switch_to_mark_scan_2: li o1,1 stb o1,0(o0) - cmpwi 0,d7,0 + cmpwi cr0,d7,0 bge end_garbage_collect li o1,-1 @@ -3178,7 +3223,7 @@ compacting_collector: lea o0,zero_bits_before_mark li g0,0 lwz o1,0(o0) - cmpwi 0,o1,0 + cmpwi cr0,o1,0 beq no_zero_bits stw g0,0(o0) @@ -3379,7 +3424,7 @@ no_mark6: lwz o1,0(o0) slwi d1,d1,5 sub d1,d1,o1 - cmpw 0,d0,d1 + cmpw cr0,d0,d1 ble no_copy_garbage_collection ; b no_copy_garbage_collection @@ -3423,7 +3468,7 @@ no_mark6: lwz d0,0(o0) lea o0,heap_vector lwz o1,0(o0) - cmpw 0,d0,o1 + cmpw cr0,d0,o1 ble vector_at_end_2 lea o0,heap_vector @@ -3527,10 +3572,6 @@ print_error: .endif halt: - - lea o0,_halt_sp - lwz sp,0(o0) - .if PROFILE mflr r0 stwu r0,-4(sp) @@ -3541,10 +3582,13 @@ halt: .if EXCEPTIONS lea o0,exception_info lwz o0,0(o0) - cmpwi 0,o0,0 + cmpwi cr0,o0,0 bne e__Exceptions__sraise__exception .endif + lea o0,halt_sp + lwz sp,0(o0) + .if 0 lea o0,_flags lwz d0,0(o0) @@ -4250,19 +4294,19 @@ empty_string: sliceAC: lwz d2,4-NODE_POINTER_OFFSET(a0) addi a2,a0,4-NODE_POINTER_OFFSET - cmpwi 0,d1,0 + cmpwi cr0,d1,0 bge slice_string_1 li d1,0 slice_string_1: - cmpw 0,d1,d2 + cmpw cr0,d1,d2 bge empty_string - cmpw 0,d0,d1 + cmpw cr0,d0,d1 addi d0,d0,1 blt empty_string - cmpw 0,d0,d2 + cmpw cr0,d0,d2 ble slice_string_2 mr d0,d2 @@ -4349,7 +4393,7 @@ gc_5: mflr r0 update_string_error: lea o0,high_index_string - cmpwi 0,d1,0 + cmpwi cr0,d1,0 bge print_error lea o0,low_index_string @@ -4362,7 +4406,7 @@ update_string_error_2: eqAC: lwzu d0,4-NODE_POINTER_OFFSET(a0) lwzu o0,4-NODE_POINTER_OFFSET(a1) - cmpw 0,d0,o0 + cmpw cr0,d0,o0 bne equal_string_ne andi. d1,d0,3 @@ -4738,7 +4782,7 @@ no_collect_4579: addi a0,a6,4+NODE_POINTER_OFFSET stw o0,4(a6) - cmpwi 0,d0,0 + cmpwi cr0,d0,0 stw d0,8(a6) stwu real_reg,12(a6) @@ -4801,7 +4845,7 @@ no_collect_4581: stw o0,4(a6) stw d0,8(a6) stwu d1,12(a6) - cmpwi 0,d3,0 + cmpwi cr0,d3,0 lwz r0,0(sp) addi sp,sp,4 @@ -4867,7 +4911,7 @@ r_array_2_bb: b st_fillr2_array st_fillr2_array: - cmpwi 0,d0,0 + cmpwi cr0,d0,0 beq skip_fillr2_array_1 mtctr d0 @@ -4896,7 +4940,7 @@ no_collect_4583: stw d0,8(a6) stwu d1,12(a6) - cmpwi 0,d3,0 + cmpwi cr0,d3,0 lwz r0,0(sp) addi a2,sp,4 @@ -4918,7 +4962,7 @@ copy_a_to_b_lp3: r_array_3: lwz d1,0(sp) - cmpwi 0,d0,0 + cmpwi cr0,d0,0 lwz d2,4(sp) lwz d3,8(sp) @@ -4952,7 +4996,7 @@ no_collect_4584: stw d0,8(a6) stwu d1,12(a6) - cmpwi 0,d3,0 + cmpwi cr0,d3,0 lwz r0,0(sp) addi a2,sp,4 @@ -4974,7 +5018,7 @@ copy_a_to_b_lp4: r_array_4: lwz d1,0(sp) lwz d2,4(sp) - cmpwi 0,d0,0 + cmpwi cr0,d0,0 lwz d3,8(sp) lwz d4,12(sp) @@ -5015,7 +5059,7 @@ no_collect_4585: stw d0,8(a6) stwu d1,12(a6) - cmpwi 0,d3,0 + cmpwi cr0,d3,0 lwz r0,0(sp) addi a2,sp,4 @@ -5308,6 +5352,7 @@ _st_fillr5_array: bge _fillr5_array_1 blr + .if !NEW_DESCRIPTORS .text ; __TEXT.yet_args_needed: @@ -5479,12 +5524,13 @@ gc_r_24: gc_24: mflr r0 bl collect_2 b gc_r_24 + .endif .text ; __TEXT.repl_args_b: repl_args_b: - cmpwi 0,d0,0 + cmpwi cr0,d0,0 ble repl_args_b_1 subic. d0,d0,1 @@ -5506,7 +5552,7 @@ repl_args_b_3: lwzu o0,-4(a1) addi a4,a4,4 stw o0,0-4(a4) - cmpwi 0,d0,0 + cmpwi cr0,d0,0 subi d0,d0,1 bne repl_args_b_3 repl_args_b_4: @@ -5522,11 +5568,11 @@ repl_args_b_1: ; __TEXT.push_arg_b: push_arg_b: - cmplwi 0,d1,2 + cmplwi cr0,d1,2 blt push_arg_b_1 bne push_arg_b_2 - cmpw 0,d1,d0 + cmpw cr0,d1,d0 beq push_arg_b_1 push_arg_b_2: lwz a0,8(a0) @@ -5605,7 +5651,7 @@ del_args_gc: o__S_P2: lwz d0,0(a0) lha d0,-2(d0) - cmpwi 0,d0,2 + cmpwi cr0,d0,2 lwz a0,8(a0) beq o__S_P2_2 lwz a0,0(a0) @@ -6094,6 +6140,10 @@ entier_real_2: addi sp,sp,4 blr + .if NEW_DESCRIPTORS +#include "pap.a" + .endif + .picsymbol_stub L_sin$stub: .indirect_symbol _sin |