summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--macho/Makefile4
-rw-r--r--macho/pap.a2787
-rw-r--r--macho/pcompact.a779
-rw-r--r--macho/pcompact_rmark.a939
-rw-r--r--macho/pcompact_rmarkr.a856
-rw-r--r--macho/pcopy.a496
-rw-r--r--macho/pmark.a501
-rw-r--r--macho/pstartup.a184
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