summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pcompact_rmark.a158
-rw-r--r--pcompact_rmarkr.a128
-rw-r--r--pcopy.a511
-rw-r--r--pmark.a336
-rw-r--r--pstartup.a552
5 files changed, 1521 insertions, 164 deletions
diff --git a/pcompact_rmark.a b/pcompact_rmark.a
index 3ce30ee..f6c8671 100644
--- a/pcompact_rmark.a
+++ b/pcompact_rmark.a
@@ -368,8 +368,8 @@ rmark_selector_node_1:
ble rmark_small_tuple_or_record
rmark_large_tuple_or_record:
- lwz o2,8-NODE_POINTER_OFFSET(a1)
- sub o2,o2,d6
+ lwz a2,8-NODE_POINTER_OFFSET(a1)
+ sub o2,a2,d6
srwi d2,o2,5
lbzx g1,o4,d2
@@ -377,15 +377,49 @@ rmark_large_tuple_or_record:
rlwnm. r0,g1,g2,24,24
bne rmark_hnf_1
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ andc o1,o1,o3
+ lea g1,__indirection
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ stbx o1,o4,o0
+
+ lhz d0,4(d0)
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ subi d2,a0,4
+
+ cmplwi 0,d0,8
+ blt rmark_tuple_or_record_selector_node_2
+ beq rmark_tuple_selector_node_2
+
+rmark_tuple_or_record_selector_node_g2:
+ addi a0,a2,-12
+ lwzx a0,a0,d0
+ stw a0,0(a3)
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b rmark_node_d1
+
+rmark_tuple_selector_node_2:
+ lwz a0,0(a2)
+ stw a0,0(a3)
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b rmark_node_d1
+ else
rmark_small_tuple_or_record:
- if LINUX
+ if LINUX
lwz g1,-8(d0)
mflr r0
- else
+ else
lha g1,-6(d0)
mflr r0
lwzx g1,rtoc,g1
- endif
+ endif
andc o1,o1,o3
lwz g1,4(g1)
@@ -409,6 +443,7 @@ rmark_small_tuple_or_record:
stw a0,4-NODE_POINTER_OFFSET(d2)
stw g1,0-NODE_POINTER_OFFSET(d2)
b rmark_node_d1
+ endif
rmark_record_selector_node_1:
srwi d2,o2,5
@@ -426,7 +461,45 @@ rmark_record_selector_node_1:
lha g1,-2(d2)
cmplwi 0,g1,258
ble rmark_small_tuple_or_record
+
+ if NEW_DESCRIPTORS
+ lwz a2,8-NODE_POINTER_OFFSET(a1)
+ sub o2,a2,d6
+
+ srwi d2,o2,5
+ lbzx g1,o4,d2
+ rlwinm g2,o2,32-2,29,31
+ rlwnm. r0,g1,g2,24,24
+ bne rmark_hnf_1
+
+rmark_small_tuple_or_record:
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ andc o1,o1,o3
+ lea g1,__indirection
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ stbx o1,o4,o0
+
+ lhz d0,4(d0)
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ subi d2,a0,4
+
+ cmplwi 0,d0,8
+ bgt rmark_tuple_or_record_selector_node_g2
+
+rmark_tuple_or_record_selector_node_2:
+ lwzx a0,a1,d0
+ stw a0,0(a3)
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b rmark_node_d1
+ else
b rmark_large_tuple_or_record
+ endif
rmark_strict_record_selector_node_1:
rlwnm. r0,g1,g2,24,24
@@ -440,8 +513,8 @@ rmark_strict_record_selector_node_1:
cmplwi 0,g1,258
ble rmark_select_from_small_record
- lwz o2,8-NODE_POINTER_OFFSET(a1)
- sub o2,o2,d6
+ lwz a2,8-NODE_POINTER_OFFSET(a1)
+ sub o2,a2,d6
srwi d2,o2,5
lbzx g1,o4,d2
@@ -452,17 +525,52 @@ rmark_strict_record_selector_node_1:
rmark_select_from_small_record:
if LINUX
lwz g1,-8(d0)
- mflr r0
else
lha g1,-6(d0)
+ endif
+ if ! NEW_DESCRIPTORS
+ if LINUX
+ mflr r0
+ else
mflr r0
lwzx g1,rtoc,g1
+ endif
endif
subi a0,a0,4
-
+ if NEW_DESCRIPTORS
+ if ! LINUX
+ lwzx g1,rtoc,g1
+ endif
+ endif
cmplw a0,d1
bgt rmark_selector_pointer_not_reversed
+ if NEW_DESCRIPTORS
+ lhz d0,4(g1)
+ cmplwi 0,d0,8
+ ble rmark_strict_record_selector_node_2
+ addi d0,d0,-12
+ lwzx d0,a2,d0
+ b rmark_strict_record_selector_node_3
+rmark_strict_record_selector_node_2:
+ lwzx d0,a1,d0
+rmark_strict_record_selector_node_3:
+ stw d0,4-NODE_POINTER_OFFSET(a0)
+
+ lhz d0,6(g1)
+ tst d0
+ beq rmark_strict_record_selector_node_5
+ cmplwi 0,d0,8
+ ble rmark_strict_record_selector_node_4
+ mr a1,a2
+ addi d0,d0,-12
+rmark_strict_record_selector_node_4:
+ lwzx d0,a1,d0
+ stw d0,8-NODE_POINTER_OFFSET(a0)
+rmark_strict_record_selector_node_5:
+
+ lwz d0,-4(g1)
+ else
stw d0,0(a0)
lwz g1,4(g1)
@@ -478,19 +586,48 @@ rmark_select_from_small_record:
mtlr r0
lwz d0,0(a0)
+ endif
+
addi a3,a3,1
stw a3,0(a0)
stw d0,-1(a3)
b rmark_next_node
rmark_selector_pointer_not_reversed:
+ if NEW_DESCRIPTORS
+ lhz d0,4(g1)
+ cmplwi 0,d0,8
+ ble rmark_strict_record_selector_node_6
+ addi d0,d0,-12
+ lwzx d0,a2,d0
+ b rmark_strict_record_selector_node_7
+rmark_strict_record_selector_node_6:
+ lwzx d0,a1,d0
+rmark_strict_record_selector_node_7:
+ stw d0,4-NODE_POINTER_OFFSET(a0)
+
+ lhz d0,6(g1)
+ tst d0
+ beq rmark_strict_record_selector_node_9
+ cmplwi 0,d0,8
+ ble rmark_strict_record_selector_node_8
+ mr a1,a2
+ addi d0,d0,-12
+rmark_strict_record_selector_node_8:
+ lwzx d0,a1,d0
+ stw d0,8-NODE_POINTER_OFFSET(a0)
+rmark_strict_record_selector_node_9:
+
+ lwz d0,-4(g1)
+ stw d0,0-NODE_POINTER_OFFSET(a0)
+ else
lwz g1,4(g1)
mtctr g1
stwu r0,-4(sp)
bctrl
mtlr r0
-
+ endif
b rmark_next_node
rmark_reverse_and_mark_next_node:
@@ -510,6 +647,7 @@ rmark_next_node:
cmplwi a0,1
bgt rmark_node
+rmark_next_node_:
blr
rmark_lazy_node:
diff --git a/pcompact_rmarkr.a b/pcompact_rmarkr.a
index 3efb806..ce75520 100644
--- a/pcompact_rmarkr.a
+++ b/pcompact_rmarkr.a
@@ -157,24 +157,56 @@ rmarkr_selector_node_1:
ble rmarkr_small_tuple_or_record
rmarkr_large_tuple_or_record:
- lwz d1,8-NODE_POINTER_OFFSET(a1)
+ lwz a2,8-NODE_POINTER_OFFSET(a1)
- sub o2,d1,d6
+ sub o2,a2,d6
srwi d2,o2,5
lbzx g1,o4,d2
rlwinm g2,o2,32-2,29,31
rlwnm. r0,g1,g2,24,24
bne rmarkr_hnf_1
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ andc o1,o1,o3
+ lea g1,__indirection
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ stbx o1,o4,o0
+
+ lhz d0,4(d0)
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ subi d2,a0,4
+
+ cmplwi 0,d0,8
+ blt rmarkr_tuple_or_record_selector_node_2
+ beq rmarkr_tuple_selector_node_2
+
+rmarkr_tuple_or_record_selector_node_g2:
+ addi a0,a2,-12
+ lwzx a0,a0,d0
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b rmarkr_node
+
+rmarkr_tuple_selector_node_2:
+ lwz a0,0(a2)
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b rmarkr_node
+ else
rmarkr_small_tuple_or_record:
- if LINUX
+ if LINUX
lwz g1,-8(d0)
mflr r0
- else
+ else
lha g1,-6(d0)
mflr r0
lwzx g1,rtoc,g1
- endif
+ endif
andc o1,o1,o3
lwz g1,4(g1)
@@ -191,6 +223,7 @@ rmarkr_small_tuple_or_record:
stw a0,4-NODE_POINTER_OFFSET(d2)
stw g1,0-NODE_POINTER_OFFSET(d2)
b rmarkr_node
+ endif
rmarkr_record_selector_node_1:
srwi d2,o2,5
@@ -208,7 +241,44 @@ rmarkr_record_selector_node_1:
lha g1,-2(d2)
cmplwi 0,g1,258
ble rmarkr_small_tuple_or_record
+
+ if NEW_DESCRIPTORS
+ lwz a2,8-NODE_POINTER_OFFSET(a1)
+
+ sub o2,a2,d6
+ srwi d2,o2,5
+ lbzx g1,o4,d2
+ rlwinm g2,o2,32-2,29,31
+ rlwnm. r0,g1,g2,24,24
+ bne rmarkr_hnf_1
+
+rmarkr_small_tuple_or_record:
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ andc o1,o1,o3
+ lea g1,__indirection
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ stbx o1,o4,o0
+
+ lhz d0,4(d0)
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ subi d2,a0,4
+
+ cmplwi 0,d0,8
+ bgt rmarkr_tuple_or_record_selector_node_g2
+
+rmarkr_tuple_or_record_selector_node_2:
+ lwzx a0,a1,d0
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b rmarkr_node
+ else
b rmarkr_large_tuple_or_record
+ endif
rmarkr_strict_record_selector_node_1:
rlwnm. r0,g1,g2,24,24
@@ -222,8 +292,8 @@ rmarkr_strict_record_selector_node_1:
cmplwi 0,g1,258
ble rmarkr_select_from_small_record
- lwz d1,8-NODE_POINTER_OFFSET(a1)
- sub o2,d1,d6
+ lwz a2,8-NODE_POINTER_OFFSET(a1)
+ sub o2,a2,d6
srwi d2,o2,5
lbzx g1,o4,d2
@@ -232,14 +302,50 @@ rmarkr_strict_record_selector_node_1:
bne rmarkr_hnf_1
rmarkr_select_from_small_record:
- if LINUX
+ if NEW_DESCRIPTORS
+ if LINUX
lwz g1,-8(d0)
- mflr r0
+ else
+ lha g1,-6(d0)
+ endif
+ subi a0,a0,4
+ if ! LINUX
+ lwzx g1,rtoc,g1
+ endif
+ lhz d0,4(g1)
+ cmplwi 0,d0,8
+ ble rmarkr_strict_record_selector_node_2
+ addi d0,d0,-12
+ lwzx d0,a2,d0
+ b rmarkr_strict_record_selector_node_3
+rmarkr_strict_record_selector_node_2:
+ lwzx d0,a1,d0
+rmarkr_strict_record_selector_node_3:
+ stw d0,4-NODE_POINTER_OFFSET(a0)
+
+ lhz d0,6(g1)
+ tst d0
+ beq rmarkr_strict_record_selector_node_5
+ cmplwi 0,d0,8
+ ble rmarkr_strict_record_selector_node_4
+ mr a1,a2
+ addi d0,d0,-12
+rmarkr_strict_record_selector_node_4:
+ lwzx d0,a1,d0
+ stw d0,8-NODE_POINTER_OFFSET(a0)
+rmarkr_strict_record_selector_node_5:
+
+ lwz d0,-4(g1)
+ stw d0,0-NODE_POINTER_OFFSET(a0)
else
+ if LINUX
+ lwz g1,-8(d0)
+ mflr r0
+ else
lha g1,-6(d0)
mflr r0
lwzx g1,rtoc,g1
- endif
+ endif
subi a0,a0,4
lwz g1,4(g1)
@@ -247,7 +353,7 @@ rmarkr_select_from_small_record:
stwu r0,-4(sp)
blrl
mtlr r0
-
+ endif
b rmarkr_next_node
rmarkr_indirection_node:
diff --git a/pcopy.a b/pcopy.a
index fcf61c1..80629c9 100644
--- a/pcopy.a
+++ b/pcopy.a
@@ -121,18 +121,26 @@ copy_record_1:
subic. d5,d5,1
bgt copy_lp2
-
+ if 1
+ b copy_node_arity1
+ else
beq- copy_node_arity1
baddi a2,8
b copy_lp1
+ endif
copy_record_arguments_1:
+ if 1
+ li d5,0
+ b copy_lp2
+ else
cmpwi d5,0
li d5,0
bne copy_lp2
baddi a2,4
b copy_lp1
+ endif
copy_record_arguments_3:
if COPIED_VECTOR
@@ -146,11 +154,14 @@ copy_record_arguments_3:
cmpwi 6,,d1,0
endif
baddi d5,2+1
+ if 1
+ subi d6,d1,1
+ else
beq 6,copy_record_arguments_3b
subic. d6,d1,1
beq copy_record_arguments_3abb
-
+ endif
slwi d5,d5,2
add d4,a2,d5
@@ -164,6 +175,7 @@ copy_record_arguments_3:
mr a2,d4
b copy_lp1
+ if 0
copy_record_arguments_3abb:
subi d5,d5,1
slwi d6,d5,2
@@ -177,6 +189,7 @@ copy_record_arguments_3b:
slwi d5,d5,2
add a2,a2,d5
b copy_lp1
+ endif
if COPIED_VECTOR
record_node_without_arguments_part:
@@ -307,13 +320,22 @@ in_hnf_2: lhz d2,-2(d0)
beq copy_arity_0_node2
cmplwi 6,d2,256
- if NODE_POINTER_OFFSET==0
+ if 0
+ if NODE_POINTER_OFFSET==0
stw a6,-4(a2)
- endif
+ endif
stw d0,0(a6)
+ endif
bge 6,copy_record_2
+ if 1
+ if NODE_POINTER_OFFSET==0
+ stw a6,-4(a2)
+ endif
+ stw d0,0(a6)
+ endif
subic. d2,d2,2
+
lwz o0,4-NODE_POINTER_OFFSET(a1)
addi a0,a6,1+NODE_POINTER_OFFSET
@@ -510,8 +532,277 @@ already_copied_2_:
bge 5,copy_lp2
blr
-; to do: copy strict basic records to end of heap
+ if 1
+copy_record_2:
+ subic. d2,d2,258
+
+ lhz o1,-2+2(d0)
+
+ blt copy_record_node2_1
+ bgt copy_record_node2_3
+
+ cmpwi o1,0
+ beq copy_real_or_file_2
+
+ if NODE_POINTER_OFFSET==0
+ stw a6,-4(a2)
+ endif
+ stw d0,0(a6)
+ lwz o0,4-NODE_POINTER_OFFSET(a1)
+
+ addi a0,a6,1+NODE_POINTER_OFFSET
+ stw a0,0-NODE_POINTER_OFFSET(a1)
+
+ lwz o1,8-NODE_POINTER_OFFSET(a1)
+
+ stw o0,4(a6)
+ if NODE_POINTER_OFFSET==0
+ stw o1,8(a6)
+ baddi a6,12
+ else
+ stwu o1,8(a6)
+ stw a6,-4(a2)
+ baddi a6,4
+ endif
+ bge 5,copy_lp2
+ blr
+
+copy_record_node2_1:
+ cmpwi o1,0
+
+ lwz o0,4-NODE_POINTER_OFFSET(a1)
+
+ beq copy_record_node2_1_b
+
+ if NODE_POINTER_OFFSET==0
+ stw a6,-4(a2)
+ endif
+ stw d0,0(a6)
+
+ addi a0,a6,1+NODE_POINTER_OFFSET
+ stw a0,0-NODE_POINTER_OFFSET(a1)
+
+ stw o0,4-NODE_POINTER_OFFSET(a6)
+ baddi a6,8
+ if NODE_POINTER_OFFSET
+ stw a6,-4(a2)
+ endif
+ bge 5,copy_lp2
+ blr
+
+copy_record_node2_1_b:
+ if NODE_POINTER_OFFSET==0
+ stwu d0,-8(o4)
+ addi d2,o4,1
+ stw d2,0-NODE_POINTER_OFFSET(a1)
+ stw o0,4(o4)
+ stw o4,-4(a2)
+ else
+ stw o4,-4(a2)
+ addi d2,o4,1
+ stw d2,0-NODE_POINTER_OFFSET(a1)
+ stw o0,-4(o4)
+ stwu d0,-8(o4)
+ endif
+ bge 5,copy_lp2
+ blr
+
+copy_record_node2_3:
+ cmplwi o1,1
+
+ lwz o0,4-NODE_POINTER_OFFSET(a1)
+
+ ble copy_record_node2_3_ab_or_b
+
+ if NODE_POINTER_OFFSET==0
+ stw a6,-4(a2)
+ endif
+ stw d0,0(a6)
+
+ addi a0,a6,1+NODE_POINTER_OFFSET
+ stw a0,0-NODE_POINTER_OFFSET(a1)
+
+ lwz a0,8-NODE_POINTER_OFFSET(a1)
+ stw o0,4(a6)
+
+ if 1
+ lwz o1,0-NODE_POINTER_OFFSET(a0)
+
+ andi. r0,o1,1
+ bne record_arguments_already_copied_2
+ else
+ if COPIED_VECTOR
+ lea a1,heap_copied_vector
+ sub d0,a0,a3
+ lwz a1,0(a1)
+
+ tstmbit a1,d0,d1,o0,o1,o2,3
+ bne record_arguments_already_copied_2
+
+ li o0,128
+ srw o0,o0,o2
+ or o1,o1,o0
+ stbx o1,a1,d1
+ endif
+ endif
+
+ if NODE_POINTER_OFFSET==0
+ addi a1,a6,12
+ stw a1,8(a6)
+ else
+ addi a1,a6,12+NODE_POINTER_OFFSET
+ stwu a1,8(a6)
+ stw a6,-4(a2)
+ endif
+ if 0
+ lwz o1,0-NODE_POINTER_OFFSET(a0)
+ endif
+ addi a1,a1,1
+ stw a1,0-NODE_POINTER_OFFSET(a0)
+ if NODE_POINTER_OFFSET==0
+ stwu o1,12(a6)
+ else
+ stwu o1,4(a6)
+ endif
+
+cp_record_arg_lp2:
+ if NODE_POINTER_OFFSET
+ lwz o1,4-NODE_POINTER_OFFSET(a0)
+ baddi a0,4
+ else
+ lwzu o1,4(a0)
+ endif
+ subic. d2,d2,1
+ stwu o1,4(a6)
+ bgt cp_record_arg_lp2
+
+ addi a6,a6,4
+
+ bge 5,copy_lp2
+ blr
+
+ if COPIED_VECTOR
+record_arguments_already_copied_2:
+ lwz o0,0-NODE_POINTER_OFFSET(a0)
+ if NODE_POINTER_OFFSET==0
+ addi a6,a6,12
+
+ stw o0,-4(a6)
+ else
+ stwu o0,8(a6)
+ stw a6,-4(a2)
+ addi a6,a6,4
+ endif
+ bge 5,copy_lp2
+ blr
+ endif
+
+copy_record_node2_3_ab_or_b:
+ blt copy_record_node2_3_b
+
+copy_record_node2_3_ab:
+ if NODE_POINTER_OFFSET==0
+ stw a6,-4(a2)
+ endif
+ stw d0,0(a6)
+
+ addi a0,a6,1+NODE_POINTER_OFFSET
+ stw a0,0-NODE_POINTER_OFFSET(a1)
+
+ lwz a0,8-NODE_POINTER_OFFSET(a1)
+ stw o0,4(a6)
+
+ if COPIED_VECTOR
+ lea a1,heap_copied_vector
+ sub d0,a0,a3
+ lwz a1,0(a1)
+
+ tstmbit a1,d0,d1,o0,o1,o2,3
+ bne record_arguments_already_copied_2
+
+ li o0,128
+ srw o0,o0,o2
+ or o1,o1,o0
+ stbx o1,a1,d1
+ endif
+
+ slwi o0,d2,2
+ lwz o1,0-NODE_POINTER_OFFSET(a0)
+ sub o0,o4,o0
+
+ subi d0,o0,3
+ subi o0,o0,4
+
+ if NODE_POINTER_OFFSET==0
+ stw d0,8(a6)
+ addi a6,a6,12
+ else
+ stwu d0,8(a6)
+ stw a6,-4(a2)
+ addi a6,a6,4
+ endif
+
+ b cp_record_arg_lp3_c
+
+copy_record_node2_3_b:
+ stwu d0,-12(o4)
+ stw o4,-4(a2)
+
+ addi a0,o4,1+NODE_POINTER_OFFSET
+ stw a0,0-NODE_POINTER_OFFSET(a1)
+
+ lwz a0,8-NODE_POINTER_OFFSET(a1)
+ stw o0,4(o4)
+
+ if COPIED_VECTOR
+ lea a1,heap_copied_vector
+ sub d0,a0,a3
+ lwz a1,0(a1)
+
+ tstmbit a1,d0,d1,o0,o1,o2,3
+ bne record_arguments_already_copied_3
+
+ li o0,128
+ srw o0,o0,o2
+ or o1,o1,o0
+ stbx o1,a1,d1
+ endif
+
+ slwi o0,d2,2
+ lwz o1,0-NODE_POINTER_OFFSET(a0)
+ sub o0,o4,o0
+
+ subi d0,o0,3
+ subi o0,o0,4
+
+ stw o0,8(o4)
+
+cp_record_arg_lp3_c:
+
+ stw d0,0-NODE_POINTER_OFFSET(a0)
+ mr o4,o0
+ stw o1,0(o0)
+
+cp_record_arg_lp3:
+ lwzu o1,4(a0)
+ subic. d2,d2,1
+ stwu o1,4(o0)
+ bgt cp_record_arg_lp3
+
+ bge 5,copy_lp2
+ blr
+
+ if COPIED_VECTOR
+record_arguments_already_copied_3:
+ lwz o0,0-NODE_POINTER_OFFSET(a0)
+ bsubi o0,1
+ stw o0,8(o4)
+ bge 5,copy_lp2
+ blr
+ endif
+
+ else
copy_record_2:
subic. d2,d2,258
lwz o0,4-NODE_POINTER_OFFSET(a1)
@@ -525,23 +816,23 @@ copy_record_2:
lwz o1,8-NODE_POINTER_OFFSET(a1)
stw o0,4(a6)
- if NODE_POINTER_OFFSET==0
+ if NODE_POINTER_OFFSET==0
stw o1,8(a6)
baddi a6,12
- else
+ else
stwu o1,8(a6)
stw a6,-4(a2)
baddi a6,4
- endif
+ endif
bge 5,copy_lp2
blr
copy_record_node2_1:
stw o0,4-NODE_POINTER_OFFSET(a6)
baddi a6,8
- if NODE_POINTER_OFFSET
+ if NODE_POINTER_OFFSET
stw a6,-4(a2)
- endif
+ endif
bge 5,copy_lp2
blr
@@ -549,7 +840,7 @@ copy_record_node2_3:
lwz a0,8-NODE_POINTER_OFFSET(a1)
stw o0,4(a6)
- if COPIED_VECTOR
+ if COPIED_VECTOR
lea a1,heap_copied_vector
sub d0,a0,a3
lwz a1,0(a1)
@@ -561,32 +852,32 @@ copy_record_node2_3:
srw o0,o0,o2
or o1,o1,o0
stbx o1,a1,d1
- endif
- if NODE_POINTER_OFFSET==0
+ endif
+ if NODE_POINTER_OFFSET==0
addi a1,a6,12
stw a1,8(a6)
- else
+ else
addi a1,a6,12+NODE_POINTER_OFFSET
stwu a1,8(a6)
stw a6,-4(a2)
- endif
+ endif
lwz o1,0-NODE_POINTER_OFFSET(a0)
addi a1,a1,1
stw a1,0-NODE_POINTER_OFFSET(a0)
- if NODE_POINTER_OFFSET==0
+ if NODE_POINTER_OFFSET==0
stwu o1,12(a6)
- else
+ else
stwu o1,4(a6)
- endif
+ endif
subi d2,d2,1
cp_record_arg_lp2:
- if NODE_POINTER_OFFSET
+ if NODE_POINTER_OFFSET
lwz o1,4-NODE_POINTER_OFFSET(a0)
baddi a0,4
- else
+ else
lwzu o1,4(a0)
- endif
+ endif
subic. d2,d2,1
stwu o1,4(a6)
bge cp_record_arg_lp2
@@ -596,20 +887,21 @@ cp_record_arg_lp2:
bge 5,copy_lp2
blr
- if COPIED_VECTOR
+ if COPIED_VECTOR
record_arguments_already_copied_2:
lwz o0,0-NODE_POINTER_OFFSET(a0)
- if NODE_POINTER_OFFSET==0
+ if NODE_POINTER_OFFSET==0
addi a6,a6,12
stw o0,-4(a6)
- else
+ else
stwu o0,8(a6)
stw a6,-4(a2)
addi a6,a6,4
- endif
+ endif
bge 5,copy_lp2
blr
+ endif
endif
not_in_hnf_2:
@@ -718,10 +1010,6 @@ copy_selector_2:
beq copy_indirection_2
mr a0,d0
-
-; if no selectors
-; b copy_arity_1_node2_
-
blt copy_record_selector_2
if LINUX
@@ -730,6 +1018,9 @@ copy_selector_2:
lha d2,-6(a0)
endif
lwz a0,4-NODE_POINTER_OFFSET(a1)
+ if ! LINUX
+ lwzx d2,rtoc,d2
+ endif
lwz d1,0-NODE_POINTER_OFFSET(a0)
andi. r0,d1,2
beq copy_arity_1_node2_
@@ -738,14 +1029,62 @@ copy_selector_2:
cmplwi 0,g1,2
ble copy_selector_2_
+ if ! NEW_DESCRIPTORS
+copy_selector_2__:
+ endif
+ if 1
+ lwz d1,8-NODE_POINTER_OFFSET(a0)
+ lwz g1,0(d1)
+ else
lwz g1,8-NODE_POINTER_OFFSET(a0)
- lwz g1,0-NODE_POINTER_OFFSET(g1)
+ lwz g1,0(g1)
+ endif
andi. r0,g1,1
bne copy_arity_1_node2_
+ if NEW_DESCRIPTORS
+ lhz d2,4(d2)
+ lea g1,__indirection
+ stw g1,0-NODE_POINTER_OFFSET(a1)
+
+ cmplwi 0,d2,8
+ blt copy_selector_2_1
+ beq copy_selector_2_2
+
+ addi d1,d1,-12
+ lwzx a0,d1,d2
+ stw a0,4-NODE_POINTER_OFFSET(a1)
+ lwz d0,0-NODE_POINTER_OFFSET(a0)
+ mr a1,a0
+ b continue_after_selector_2
+
+copy_selector_2_1:
+ lwz a0,4-NODE_POINTER_OFFSET(a0)
+ stw a0,4-NODE_POINTER_OFFSET(a1)
+ lwz d0,0-NODE_POINTER_OFFSET(a0)
+ mr a1,a0
+ b continue_after_selector_2
+
+copy_selector_2_2:
+ lwz a0,0(d1)
+ stw a0,4-NODE_POINTER_OFFSET(a1)
+ lwz d0,0-NODE_POINTER_OFFSET(a0)
+ mr a1,a0
+ b continue_after_selector_2
+
copy_selector_2_:
- if LINUX
+ lhz d2,4(d2)
+ lea g1,__indirection
+ stw g1,0-NODE_POINTER_OFFSET(a1)
+
+ lwzx a0,a0,d2
+ stw a0,4-NODE_POINTER_OFFSET(a1)
+ lwz d0,0-NODE_POINTER_OFFSET(a0)
+ mr a1,a0
+ b continue_after_selector_2
else
+copy_selector_2_:
+ if ! LINUX
lwzx d2,rtoc,d2
endif
lwz g1,4(d2)
@@ -766,6 +1105,7 @@ copy_selector_2_:
mr a1,a0
lwz d0,0-NODE_POINTER_OFFSET(a1)
b continue_after_selector_2
+ endif
copy_record_selector_2:
cmpwi 0,d2,-2-3
@@ -782,19 +1122,67 @@ copy_record_selector_2:
beq copy_arity_1_node2_
lha g1,-2(d1)
+ if ! LINUX
+ lwzx d2,rtoc,d2
+ endif
cmplwi 0,g1,258
+ if NEW_DESCRIPTORS
+ ble copy_record_selector_2_
+ else
ble copy_selector_2_
+ endif
+
+ if 1
+ lhz g1,-2+2(d1)
+ cmplwi 0,g1,2
+ bge copy_selector_2__
+ endif
- if COPIED_VECTOR
lea g1,heap_copied_vector
+ if 1
+ lwz d1,8-NODE_POINTER_OFFSET(a0)
+ lwz g1,0(g1)
+ sub g0,d1,a3
+
+ tstmbit g1,g0,o0,g1,o1,o2,3
+ else
lwz g0,8-NODE_POINTER_OFFSET(a0)
lwz g1,0(g1)
sub g0,g0,a3
tstmbit g1,g0,d1,o0,o1,o2,3
- bne copy_arity_1_node2_
endif
+ if NEW_DESCRIPTORS
+ if 1
+ beq copy_record_selector_2_
+ b copy_arity_1_node2_
+copy_selector_2__:
+ lwz d1,8-NODE_POINTER_OFFSET(a0)
+ lwz g1,0(d1)
+ andi. r0,g1,1
+ bne copy_arity_1_node2_
+ else
+ bne copy_arity_1_node2_
+ endif
+copy_record_selector_2_:
+ lhz d2,4(d2)
+ lea g1,__indirection
+ stw g1,0-NODE_POINTER_OFFSET(a1)
+
+ cmplwi 0,d2,8
+ ble copy_record_selector_3
+ mr a0,d1
+ addi d2,d2,-12
+copy_record_selector_3:
+ lwzx a0,a0,d2
+ stw a0,4-NODE_POINTER_OFFSET(a1)
+ lwz d0,0-NODE_POINTER_OFFSET(a0)
+ mr a1,a0
+ b continue_after_selector_2
+ else
+ bne copy_arity_1_node2_
b copy_selector_2_
+ endif
copy_strict_record_selector_2:
lwz a0,4-NODE_POINTER_OFFSET(a1)
@@ -803,24 +1191,66 @@ copy_strict_record_selector_2:
beq copy_arity_1_node2_
lha g1,-2(d1)
+ if ! LINUX
+ lwzx d2,rtoc,d2
+ endif
cmplwi 0,g1,258
ble copy_strict_record_selector_2_
- if COPIED_VECTOR
+ if 1
+ lhz g1,-2+2(d1)
+ cmplwi 0,g1,2
+ blt copy_strict_record_selector_2_b
+
+ lwz d1,8-NODE_POINTER_OFFSET(a0)
+ lwz g1,0(d1)
+ andi. r0,g1,1
+ bne copy_arity_1_node2_
+ b copy_strict_record_selector_2_
+
+copy_strict_record_selector_2_b:
+ endif
+
lea g1,heap_copied_vector
- lwz g0,8-NODE_POINTER_OFFSET(a0)
+ lwz d1,8-NODE_POINTER_OFFSET(a0)
lwz g1,0(g1)
- sub g0,g0,a3
+ sub g0,d1,a3
tstmbit g1,g0,d1,o0,o1,o2,3
bne copy_arity_1_node2_
- endif
copy_strict_record_selector_2_:
- if LINUX
+ if NEW_DESCRIPTORS
+ lhz d0,4(d2)
+ cmplwi 0,d0,8
+ ble copy_strict_record_selector_3
+ addi d0,d0,-12
+ lwzx d0,d1,d0
+ b copy_strict_record_selector_4
+copy_strict_record_selector_3:
+ lwzx d0,a0,d0
+copy_strict_record_selector_4:
+ stw d0,4-NODE_POINTER_OFFSET(a1)
+
+ lhz d0,6(d2)
+ cmplwi 0,d0,0
+ beq copy_strict_record_selector_6
+ cmplwi 0,d0,d1
+ ble copy_strict_record_selector_5
+ addi d0,d0,-12
+ mr a0,d1
+copy_strict_record_selector_5:
+ lwzx d0,a0,d0
+ stw d0,8-NODE_POINTER_OFFSET(a1)
+
+ lwz d0,-4(d2)
+ stw d0,0-NODE_POINTER_OFFSET(a1)
+ b in_hnf_2
+copy_strict_record_selector_6:
else
+ if ! LINUX
lwzx d2,rtoc,d2
- endif
+ endif
mr d0,a1
lwz g1,4(d2)
mr a1,a0
@@ -836,6 +1266,7 @@ copy_strict_record_selector_2_:
lwz d0,0-NODE_POINTER_OFFSET(a0)
mr a1,a0
b in_hnf_2
+ endif
copy_arity_0_node2_:
if NODE_POINTER_OFFSET==0
@@ -912,7 +1343,7 @@ copy_array_2:
mullw d2,d2,d0
copy_array_a2:
- addi a1,a6,-NODE_POINTER_OFFSET
+ addi a1,a6,0-NODE_POINTER_OFFSET
slwi d1,d2,2
add a6,a6,d1
diff --git a/pmark.a b/pmark.a
index 99272cd..37adba6 100644
--- a/pmark.a
+++ b/pmark.a
@@ -54,6 +54,8 @@ _end_mark_cafs:
bl _mark_stack_nodes
+continue_mark_after_pmark:
+
lea a0,lazy_array_list
lwz a0,0(a0)
@@ -238,6 +240,18 @@ no_extra_word:
lwz o2,0(o1)
addi o2,o2,1
endif
+
+ if MEASURE_GC
+ lea o0,total_gc_bytes_lo
+ lwz g1,0(o0)
+ addc g1,g1,d4
+ stw g1,0(o0)
+ lea o0,total_gc_bytes_hi
+ lwz g1,0(o0)
+ addze g1,g1
+ stw g1,0(o0)
+ endif
+
lea o0,flags
lwz o0,0(o0)
andi. r0,o0,2
@@ -664,24 +678,68 @@ _mark_selector_node_1:
_large_tuple_or_record:
lwz d1,8(a1)
- sub d1,d1,d6
- rlwinm o0,d1,32-5,5,29
+ sub o1,d1,d6
+ rlwinm o0,o1,32-5,5,29
lwzx g1,o4,o0
- rlwinm d1,d1,32-2,27,31
- rlwnm. r0,g1,d1,0,0
+ rlwinm o1,o1,32-2,27,31
+ rlwnm. r0,g1,o1,0,0
bne _mark_node3
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ subi d2,a0,4
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz d0,4(d0)
+ cmplwi 0,d0,8
+ blt _mark_tuple_selector_node_1
+ mr a1,d1
+ beq _mark_tuple_selector_node_2
+ addi d0,d0,-12
+ lwzx a0,a1,d0
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b _mark_node
+
+_mark_tuple_selector_node_2:
+ lwz a0,0-NODE_POINTER_OFFSET(a1)
+ stw a0,4-NODE_POINTER_OFFSET(d2)
+ b _mark_node
+ endif
+
_small_tuple_or_record:
- if LINUX
- lwz g1,-8(d0)
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ subi d2,a0,4
+ lhz d0,4(d0)
+_mark_tuple_selector_node_1:
+ lwzx a0,a1,d0
+ stw a0,4-NODE_POINTER_OFFSET(d2)
else
+ if LINUX
+ lwz g1,-8(d0)
+ else
lha g1,-6(d0)
- endif
+ endif
subi d2,a0,4
- if LINUX
- else
+ if ! LINUX
lwzx g1,rtoc,g1
- endif
+ endif
mr a0,a1
lwz g1,4(g1)
@@ -694,9 +752,10 @@ _small_tuple_or_record:
lea g1,__indirection
stw a0,4-NODE_POINTER_OFFSET(d2)
stw g1,0-NODE_POINTER_OFFSET(d2)
+ endif
if REMOVE_INDIRECTION_LISTS
- addi g2,d2,4
- b __mark_node
+ addi g2,d2,4
+ b __mark_node
else
b _mark_node
endif
@@ -714,7 +773,40 @@ _mark_record_selector_node_1:
lhz g1,-2(d2)
cmplwi 0,g1,258
ble _small_tuple_or_record
+
+ if NEW_DESCRIPTORS
+ lwz d1,8-NODE_POINTER_OFFSET(a1)
+
+ sub o1,d1,d6
+ rlwinm o0,o1,32-5,5,29
+ lwzx g1,o4,o0
+ rlwinm o1,o1,32-2,27,31
+ rlwnm. r0,g1,o1,0,0
+ bne _mark_node3
+
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz d0,4(d0)
+ cmplwi 0,d0,8
+ ble _mark_record_selector_node_2
+ mr a1,d1
+ addi d0,d0,-12
+_mark_record_selector_node_2:
+ lwzx a0,a1,d0
+ stw a0,0-NODE_POINTER_OFFSET(d2)
+ b _mark_node
+ else
b _large_tuple_or_record
+ endif
_mark_strict_record_selector_node_1:
rlwnm. r0,o1,d1,0,0
@@ -731,24 +823,59 @@ _no_mark_strict_record_selector_node_1:
lwz d1,8-NODE_POINTER_OFFSET(a1)
- sub d1,d1,d6
- rlwinm o0,d1,32-5,5,29
+ sub o1,d1,d6
+ rlwinm o0,o1,32-5,5,29
lwzx g1,o4,o0
- rlwinm d1,d1,32-2,27,31
- rlwnm. r0,g1,d1,0,0
+ rlwinm o1,o1,32-2,27,31
+ rlwnm. r0,g1,o1,0,0
bne _mark_node3
-
+
_select_from_small_record:
- if LINUX
- lwz g1,-8(d0)
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ subi a0,a0,4
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz g1,4(d0)
+ cmplwi 0,g1,8
+ ble _mark_strict_record_selector_node_2
+ addi g1,g1,-12
+ lwzx g1,d1,g1
+ b _mark_strict_record_selector_node_3
+_mark_strict_record_selector_node_2:
+ lwzx g1,a1,g1
+_mark_strict_record_selector_node_3:
+ stw g1,4-NODE_POINTER_OFFSET(a0)
+
+ lhz g1,6(d0)
+ tst g1
+ beq _mark_strict_record_selector_node_5
+ cmplwi 0,g1,8
+ ble _mark_strict_record_selector_node_4
+ mr a1,d1
+ addi g1,g1,-12
+_mark_strict_record_selector_node_4:
+ lwzx g1,a1,g1
+ stw g1,8-NODE_POINTER_OFFSET(a0)
+_mark_strict_record_selector_node_5:
+
+ lwz d0,-4(d0)
+ stw d0,0-NODE_POINTER_OFFSET(a0)
else
+ if LINUX
+ lwz g1,-8(d0)
+ else
lha g1,-6(d0)
- endif
+ endif
subi a0,a0,4
- if LINUX
- else
+ if ! LINUX
lwzx g1,rtoc,g1
- endif
+ endif
lwz g1,4(g1)
mtctr g1
@@ -756,6 +883,7 @@ _select_from_small_record:
stwu r0,-4(sp)
bctrl
mtlr r0
+ endif
b _mark_next_node
@@ -875,8 +1003,7 @@ __small_tuple_or_record:
lha g1,-6(d0)
endif
mr d2,a0
- if LINUX
- else
+ if ! LINUX
lwzx g1,rtoc,g1
endif
mr a0,a1
@@ -1384,7 +1511,7 @@ _end_set_lazy_array_bits:
mflr d1
stw a2,-8(sp)
- addi a2,a0,12--NODE_POINTER_OFFSET
+ addi a2,a0,12-NODE_POINTER_OFFSET
stw a4,-4(sp)
slwi d2,d2,2
@@ -1637,9 +1764,9 @@ __mark__selector__node__1:
cmplwi 0,g1,2
ble __small__tuple__or__record
-__large__tuple__or__record:
- lwz o2,8-NODE_POINTER_OFFSET(a1)
- sub o2,o2,d6
+__large__tuple__or__record:
+ lwz d1,8-NODE_POINTER_OFFSET(a1)
+ sub o2,d1,d6
rlwinm d2,o2,32-5,5,29
lwzx g1,o4,d2
@@ -1649,17 +1776,61 @@ __large__tuple__or__record:
and. r0,g2,g1
bne- __mark__selector__1
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz d0,4(d0)
+ cmplwi 0,d0,8
+ blt __mark_tuple_selector_node_1
+ mr a1,d1
+ beq __mark_tuple_selector_node_2
+ addi d0,d0,-12
+ lwzx a0,a1,d0
+ stw a0,0(d2)
+ b __mark__node
+
+__mark_tuple_selector_node_2:
+ lwz a0,0(a1)
+ stw a0,0(d2)
+ b __mark__node
+ endif
+
__small__tuple__or__record:
- if LINUX
- lwz g1,-8(d0)
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz d0,4(d0)
+__mark_tuple_selector_node_1:
+ lwzx a0,a1,d0
+ stw a0,0(d2)
else
+ if LINUX
+ lwz g1,-8(d0)
+ else
lha g1,-6(d0)
- endif
+ endif
subi d2,a0,4
- if LINUX
- else
+ if ! LINUX
lwzx g1,rtoc,g1
- endif
+ endif
mr a0,a1
lwz g1,4(g1)
@@ -1672,6 +1843,7 @@ __small__tuple__or__record:
lea g1,__indirection
stw a0,4-NODE_POINTER_OFFSET(d2)
stw g1,0-NODE_POINTER_OFFSET(d2)
+ endif
b __mark__node
__mark__record__selector__node__1:
@@ -1686,8 +1858,45 @@ __mark__record__selector__node__1:
lhz g1,-2(d2)
cmplwi 0,g1,258
+ if NEW_DESCRIPTORS
+ ble __small__record
+
+ lwz d1,8-NODE_POINTER_OFFSET(a1)
+ sub o2,d1,d6
+
+ rlwinm d2,o2,32-5,5,29
+ lwzx g1,o4,d2
+ rlwinm o2,o2,32-2,27,31
+ srw g2,g3,o2
+
+ and. r0,g2,g1
+ bne- __mark__selector__1
+
+__small__record:
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ lea g1,__indirection
+ stw g1,-4-NODE_POINTER_OFFSET(a0)
+ mr d2,a0
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz d0,4(d0)
+ cmplwi 0,d0,8
+ ble __mark_record_selector_node_2
+ mr a1,d1
+ addi d0,d0,-12
+__mark_record_selector_node_2:
+ lwzx a0,a1,d0
+ stw a0,0(d2)
+ b __mark__node
+ else
ble __small__tuple__or__record
b __large__tuple__or__record
+ endif
__mark__strict__record__selector__node__1:
rlwnm. r0,g1,o2,0,0
@@ -1701,26 +1910,61 @@ __mark__strict__record__selector__node__1:
cmplwi 0,g1,258
ble __select__from__small__record
- lwz o2,8-NODE_POINTER_OFFSET(a1)
- sub o2,o2,d6
+ lwz d1,8-NODE_POINTER_OFFSET(a1)
+ sub o2,d1,d6
rlwinm d2,o2,32-5,5,29
lwzx g1,o4,d2
rlwinm o2,o2,32-2,27,31
rlwnm. r0,g1,o2,0,0
bne- __mark__selector__1
-
+
__select__from__small__record:
- if LINUX
- lwz g1,-8(d0)
+ if NEW_DESCRIPTORS
+ if LINUX
+ lwz d0,-8(d0)
+ else
+ lha d0,-6(d0)
+ endif
+ subi a0,a0,4
+ if ! LINUX
+ lwzx d0,rtoc,d0
+ endif
+ lhz g1,4(d0)
+ cmplwi 0,g1,8
+ ble __mark_strict_record_selector_node_2
+ addi g1,g1,-12
+ lwzx g1,d1,g1
+ b __mark_strict_record_selector_node_3
+__mark_strict_record_selector_node_2:
+ lwzx g1,a1,g1
+__mark_strict_record_selector_node_3:
+ stw g1,4-NODE_POINTER_OFFSET(a0)
+
+ lhz g1,6(d0)
+ tst g1
+ beq __mark_strict_record_selector_node_5
+ cmplwi 0,g1,8
+ ble __mark_strict_record_selector_node_4
+ mr a1,d1
+ addi g1,g1,-12
+__mark_strict_record_selector_node_4:
+ lwzx g1,a1,g1
+ stw g1,8-NODE_POINTER_OFFSET(a0)
+__mark_strict_record_selector_node_5:
+
+ lwz d0,-4(d0)
+ stw d0,0-NODE_POINTER_OFFSET(a0)
else
+ if LINUX
+ lwz g1,-8(d0)
+ else
lha g1,-6(d0)
- endif
+ endif
subi a0,a0,4
- if LINUX
- else
+ if ! LINUX
lwzx g1,rtoc,g1
- endif
+ endif
lwz g1,4(g1)
mtctr g1
@@ -1728,7 +1972,7 @@ __select__from__small__record:
stwu r0,-4(sp)
bctrl
mtlr r0
-
+ endif
b __mark__node
__mark__indirection__node:
@@ -2114,8 +2358,6 @@ __mark__ab__record__array:
mullw d1,a1,g1
badd d4,d1
badd d1,d0
-
-; to do add n b elements to d4
slwi d1,d1,2
add d1,a0,d1
diff --git a/pstartup.a b/pstartup.a
index 33bde4f..c806097 100644
--- a/pstartup.a
+++ b/pstartup.a
@@ -93,8 +93,10 @@ WRITE_HEAP set 0
WRITE_HEAP set 1
STDERR_TO_FILE set 1
endif
+NEW_DESCRIPTORS set 1
;PROFILE set 1
-UNBOXED_CLOSURES set 1
+PREFETCH set 0
+MARK_WITH_STACK set 1
MODULE_NAMES_IN_TIME_PROFILER set 1
@@ -104,12 +106,18 @@ MINIMUM_HEAP_SIZE set 8000
if 1
DESCRIPTOR_ARITY_OFFSET set (-2)
+ if NEW_DESCRIPTORS
+ZERO_ARITY_DESCRIPTOR_OFFSET set (-4)
+ else
ZERO_ARITY_DESCRIPTOR_OFFSET set (-8)
+ endif
else
DESCRIPTOR_ARITY_OFFSET set (-8)
ZERO_ARITY_DESCRIPTOR_OFFSET set (-12)
endif
+NO_PREFETCH_MASK set 4096
+
export r_to_i_buffer
comm r_to_i_buffer,8
comm heap_mbp,4
@@ -141,6 +149,10 @@ ZERO_ARITY_DESCRIPTOR_OFFSET set (-12)
if MEASURE_GC
comm compact_garbage_collect_time,4
comm mark_compact_garbage_collect_time,4
+ comm total_gc_bytes_lo,4
+ comm total_gc_bytes_hi,4
+ comm total_compact_gc_bytes_lo,4
+ comm total_compact_gc_bytes_hi,4
endif
export saved_heap_p
comm saved_heap_p,8
@@ -306,10 +318,6 @@ garbage_collector_name:
dc.b 0
align 2
endif
- if WRITE_HEAP
- comm heap2_begin_and_end,8
- endif
-
align 3
entier_constants_and_buffers:
dc.d "0.0"
@@ -318,7 +326,18 @@ entier_constants_and_buffers:
dc.l 0x00000000
dc.l 0x43300000
dc.l 0x80000000
-
+ if MEASURE_GC
+f_power2_52:
+ dc.l 0x43300000
+ dc.l 0x00000000
+f_60:
+ dc.d "60"
+f_1000000:
+ dc.d "1000000"
+ endif
+ if WRITE_HEAP
+ comm heap2_begin_and_end,8
+ endif
if FINALIZERS
import __Nil
import e____system__kFinalizer
@@ -331,7 +350,6 @@ entier_constants_and_buffers:
if STACK_OVERFLOW_EXCEPTION_HANDLER
import .allocate_a_stack
endif
-
align 1
csect text{PR}
@@ -458,6 +476,7 @@ entier_constants_and_buffers:
endif
export __driver
+ export .print_execution_time{PR}
; from system.abc:
import INT
@@ -488,10 +507,12 @@ entier_constants_and_buffers:
import .er_print_string
import .er_print_int
import .er_print_text
+ import .er_print_real
else
import .ew_print_char
import .ew_print_string
import .ew_print_int
+ import .ew_print_real
endif
if 0
@@ -865,7 +886,84 @@ exit:
else
stwu sp,-64(sp)
endif
-
+
+ bl .print_execution_time
+
+ if MACOSX
+ lwz sp,0(sp)
+ else
+ addi sp,sp,64
+ endif
+no_print_execution_time:
+
+exit_3:
+exit_2:
+ lea o0,heap_mbp
+ if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(64+28)(sp)
+ else
+ stwu sp,-64(sp)
+ endif
+ lwz o0,0(o0)
+ if LINUX
+ bl free
+ else
+ bl .DisposePtr
+ endif
+ nop
+ if MACOSX
+ lwz sp,0(sp)
+ else
+ addi sp,sp,64
+ endif
+
+exit_1:
+ if STDERR_TO_FILE
+ lea o0,flags
+ lwz d0,0(o0)
+ andi. g0,d0,128
+ beq no_close_stderr_file
+
+ if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(64+28)(sp)
+ else
+ stwu sp,-64(sp)
+ endif
+ bl .close_stderr_file
+ nop
+ if MACOSX
+ lwz sp,0(sp)
+ else
+ addi sp,sp,64
+ endif
+
+no_close_stderr_file:
+ endif
+ if PROFILE
+ mflr r0
+ stwu r0,-4(sp)
+ bl write_profile_information
+ endif
+
+ lwz r0,76(sp)
+ mtlr r0
+ lmw r13,0(sp)
+ addi sp,sp,80
+ blr
+
+
+ csect .print_execution_time{PR}
+.print_execution_time:
+ mflr r0
+ stw r0,8(sp)
+ stwu sp,-64(sp)
+
+ bl .add_execute_time
+
lea o0,time_string_1
if STDERR_TO_FILE
bl .er_print_string
@@ -948,6 +1046,76 @@ exit:
bl _print_time
+ if MEASURE_GC
+ li o0,13
+ if STDERR_TO_FILE
+ bl .er_print_char
+ else
+ bl .ew_print_char
+ endif
+ nop
+
+ lea o0,total_gc_bytes_hi
+ lwz o0,0(o0)
+ if STDERR_TO_FILE
+ bl .er_print_int
+ else
+ bl .ew_print_int
+ endif
+ nop
+
+ li o0,':'
+ if STDERR_TO_FILE
+ bl .er_print_char
+ else
+ bl .ew_print_char
+ endif
+ nop
+
+ lea o0,total_gc_bytes_lo
+ lwz o0,0(o0)
+ if STDERR_TO_FILE
+ bl .er_print_int
+ else
+ bl .ew_print_int
+ endif
+ nop
+
+ li o0,32
+ if STDERR_TO_FILE
+ bl .er_print_char
+ else
+ bl .ew_print_char
+ endif
+ nop
+
+ lea o0,total_compact_gc_bytes_hi
+ lwz o0,0(o0)
+ if STDERR_TO_FILE
+ bl .er_print_int
+ else
+ bl .ew_print_int
+ endif
+ nop
+
+ li o0,':'
+ if STDERR_TO_FILE
+ bl .er_print_char
+ else
+ bl .ew_print_char
+ endif
+ nop
+
+ lea o0,total_compact_gc_bytes_lo
+ lwz o0,0(o0)
+ if STDERR_TO_FILE
+ bl .er_print_int
+ else
+ bl .ew_print_int
+ endif
+ nop
+ endif
+
li o0,13
if STDERR_TO_FILE
bl .er_print_char
@@ -956,72 +1124,241 @@ exit:
endif
nop
- if MACOSX
- lwz sp,0(sp)
+
+ lea g0,total_gc_bytes_hi
+ lea g1,total_gc_bytes_lo
+ bl fload_52_bit_int
+ if STDERR_TO_FILE
+ bl .er_print_real
else
- addi sp,sp,64
+ bl .ew_print_real
endif
-no_print_execution_time:
+ nop
-exit_3:
-exit_2:
- lea o0,heap_mbp
- if MACOSX
- mr g0,sp
- ori sp,sp,28
- stwu g0,-(64+28)(sp)
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g0,total_compact_gc_bytes_hi
+ lea g1,total_compact_gc_bytes_lo
+ bl fload_52_bit_int
+ if STDERR_TO_FILE
+ bl .er_print_real
else
- stwu sp,-64(sp)
+ bl .ew_print_real
endif
- lwz o0,0(o0)
- if LINUX
- bl free
+ nop
+
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g1,garbage_collect_time
+ lea o1,f_power2_52
+ lwz g1,0(g1)
+ lis o0,0x4330
+ stw g1,-4(sp)
+ stw o0,-8(sp)
+ lfd f2,0(o1)
+ lfd f1,-8(sp)
+ fsub f1,f1,f2
+ if STDERR_TO_FILE
+ bl .er_print_real
else
- bl .DisposePtr
+ bl .ew_print_real
endif
nop
- if MACOSX
- lwz sp,0(sp)
+
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g1,mark_compact_garbage_collect_time
+ lea o1,f_power2_52
+ lwz g1,0(g1)
+ lis o0,0x4330
+ stw g1,-4(sp)
+ stw o0,-8(sp)
+ lfd f2,0(o1)
+ lfd f1,-8(sp)
+ fsub f1,f1,f2
+ if STDERR_TO_FILE
+ bl .er_print_real
else
- addi sp,sp,64
+ bl .ew_print_real
endif
+ nop
-exit_1:
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g1,compact_garbage_collect_time
+ lea o1,f_power2_52
+ lwz g1,0(g1)
+ lis o0,0x4330
+ stw g1,-4(sp)
+ stw o0,-8(sp)
+ lfd f2,0(o1)
+ lfd f1,-8(sp)
+ fsub f1,f1,f2
if STDERR_TO_FILE
- lea o0,flags
- lwz d0,0(o0)
- andi. g0,d0,128
- beq no_close_stderr_file
+ bl .er_print_real
+ else
+ bl .ew_print_real
+ endif
+ nop
- if MACOSX
- mr g0,sp
- ori sp,sp,28
- stwu g0,-(64+28)(sp)
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g0,total_gc_bytes_hi
+ lea g1,total_gc_bytes_lo
+ bl fload_52_bit_int
+ lea g1,garbage_collect_time
+ bl compute_mb_per_second
+ if STDERR_TO_FILE
+ bl .er_print_real
else
- stwu sp,-64(sp)
+ bl .ew_print_real
endif
- bl .close_stderr_file
- nop
- if MACOSX
- lwz sp,0(sp)
+ nop
+
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g0,total_compact_gc_bytes_hi
+ lea g1,total_compact_gc_bytes_lo
+ bl fload_52_bit_int
+ lea g1,mark_compact_garbage_collect_time
+ bl compute_mb_per_second
+ if STDERR_TO_FILE
+ bl .er_print_real
else
- addi sp,sp,64
+ bl .ew_print_real
endif
+ nop
-no_close_stderr_file:
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g0,total_compact_gc_bytes_hi
+ lea g1,total_compact_gc_bytes_lo
+ bl fload_52_bit_int
+ lea g1,compact_garbage_collect_time
+ bl compute_mb_per_second
+ if STDERR_TO_FILE
+ bl .er_print_real
+ else
+ bl .ew_print_real
endif
- if PROFILE
- mflr r0
- stwu r0,-4(sp)
- bl write_profile_information
+ nop
+
+ li o0,' '
+ bl .er_print_char
+ nop
+
+ lea g0,total_compact_gc_bytes_hi
+ lea g1,total_compact_gc_bytes_lo
+ bl fload_52_bit_int
+ lea g0,mark_compact_garbage_collect_time
+ lea g1,compact_garbage_collect_time
+ lwz g0,0(g0)
+ lwz g1,0(g1)
+ lis o0,0x4330
+ add g1,g1,g0
+ stw g1,-4(sp)
+ stw o0,-8(sp)
+ lfd f3,0(o1)
+ lfd f2,-8(sp)
+ lea o1,f_60
+ lea o0,f_1000000
+ fsub f2,f2,f3
+ lfd f4,0(o1)
+ lfd f3,0(o0)
+ fmul f1,f1,f4
+ fmul f2,f2,f3
+ fdiv f1,f1,f2
+ if STDERR_TO_FILE
+ bl .er_print_real
+ else
+ bl .ew_print_real
endif
+ nop
- lwz r0,76(sp)
+ li o0,13
+ bl .er_print_char
+ nop
+
+
+ lea o1,execute_time
+ li o0,0
+ stw o0,0(o1)
+
+ lea o1,garbage_collect_time
+ stw o0,0(o1)
+ if MEASURE_GC
+ lea o1,mark_compact_garbage_collect_time
+ stw o0,0(o1)
+
+ lea o1,compact_garbage_collect_time
+ stw o0,0(o1)
+ endif
+ lea o1,IO_time
+ stw o0,0(o1)
+
+ lea o1,total_gc_bytes_hi
+ stw o0,0(o1)
+ lea o1,total_gc_bytes_lo
+ stw o0,0(o1)
+ lea o1,total_compact_gc_bytes_hi
+ stw o0,0(o1)
+ lea o1,total_compact_gc_bytes_lo
+ stw o0,0(o1)
+
+
+ lwz r0,64+8(sp)
+ addi sp,sp,64
mtlr r0
- lmw r13,0(sp)
- addi sp,sp,80
blr
+fload_52_bit_int:
+ lea o1,f_power2_52
+ lwz g0,0(g0)
+ lwz g1,0(g1)
+ lis o0,0x4330
+ andc g0,g0,o0
+ or g0,g0,o0
+ stw g1,-4(sp)
+ stw g0,-8(sp)
+ lfd f2,0(o1)
+ lfd f1,-8(sp)
+ fsub f1,f1,f2
+ blr
+
+compute_mb_per_second:
+ lwz g1,0(g1)
+ lis o0,0x4330
+ stw g1,-4(sp)
+ stw o0,-8(sp)
+ lfd f3,0(o1)
+ lfd f2,-8(sp)
+ lea o1,f_60
+ lea o0,f_1000000
+ fsub f2,f2,f3
+ lfd f4,0(o1)
+ lfd f3,0(o0)
+ fmul f1,f1,f4
+ fmul f2,f2,f3
+ fdiv f1,f1,f2
+ blr
+
+
+ csect text{PR}
+
__driver:
lea o1,flags
lwz o0,0(o1)
@@ -1176,7 +1513,21 @@ print_symbol_2:
cmpwi 0,d1,0
bne end_print_symbol
-printD_: lha d1,-2(d0)
+printD_:
+ lha d1,-2(d0)
+ if NEW_DESCRIPTORS
+ cmplwi 0,d1,256
+ bge print_record
+
+ lhz d1,0(d0)
+ addi a2,d0,10
+ add a2,a2,d1
+ b print_string_a2
+
+print_record:
+ lwz a2,-6(d0)
+ b print_string_a2
+ else
addi a2,d0,-2
cmplwi 0,d1,256
@@ -1194,6 +1545,7 @@ printD_: lha d1,-2(d0)
print_record:
lwz a2,-4(a2)
b print_string_a2
+ endif
end_print_symbol:
lwz r0,0(sp)
@@ -1486,13 +1838,23 @@ eprint__string__:
blr
csect .eprintD
-eprintD: andi. r0,d0,2
+eprintD:
+ andi. r0,d0,2
bne eprintD_
mr a2,d0
b eprint_string_a2
-eprintD_: lha d1,-2(d0)
+eprintD_:
+ lha d1,-2(d0)
+ if NEW_DESCRIPTORS
+ cmplwi 0,d1,256
+ bge eprint_record
+
+ lhz d1,0(d0)
+ addi a2,d0,10
+ add a2,a2,d1
+ else
addi a2,d0,-2
cmplwi 0,d1,256
@@ -1505,10 +1867,15 @@ eprintD_: lha d1,-2(d0)
addi a2,a2,4
slwi d1,d1,3
add a2,a2,d1
+ endif
b eprint_string_a2
eprint_record:
+ if NEW_DESCRIPTORS
+ lwz a2,-6(d0)
+ else
lwz a2,-4(a2)
+ endif
eprint_string_a2:
lwz o1,0(a2)
@@ -1545,7 +1912,16 @@ eprint_string_a2:
csect .DtoAC
-DtoAC: lha d1,-2(d0)
+DtoAC:
+ lha d1,-2(d0)
+ if NEW_DESCRIPTORS
+ cmplwi 0,d1,256
+ bge DtoAC_record
+
+ lhz d1,0(d0)
+ addi a0,d0,10
+ add a0,a0,d1
+ else
addi a0,d0,-2
cmplwi 0,d1,256
@@ -1553,12 +1929,13 @@ DtoAC: lha d1,-2(d0)
slwi d1,d1,3
bsub a0,d1
- if 1
+
lhz d1,DESCRIPTOR_ARITY_OFFSET(a0)
baddi a0,4
slwi d1,d1,3
badd a0,d1
endif
+
DtoAC_a0:
lwz d2,0(a0)
mr a2,a0
@@ -1597,7 +1974,11 @@ DtoAC_gc: mflr r0
b DtoAC_r_gc
DtoAC_record:
+ if NEW_DESCRIPTORS
+ lwz a0,-6(d0)
+ else
lwz a0,-4(a0)
+ endif
b DtoAC_a0
csect .push_a_r_args
@@ -2713,6 +3094,22 @@ end_zero_bit_vector:
stw o4,0(o0)
sub d7,o4,a6
+
+ if MEASURE_GC
+ lea o1,heap_size_129
+ lea o0,total_gc_bytes_lo
+ lwz d0,0(o1)
+ lwz o1,0(o0)
+ slwi d0,d0,6
+ sub d0,d0,d7
+ addc o1,o1,d0
+ stw o1,0(o0)
+ lea o0,total_gc_bytes_hi
+ lwz o1,0(o0)
+ addze o1,o1
+ stw o1,0(o0)
+ endif
+
srwi d7,d7,2
bl .add_garbage_collect_time
@@ -3306,7 +3703,17 @@ no_zero_bits:
no_smaller_heap:
endif
+
+ if PREFETCH
+ lea o0,flags
+ lwz o0,0(o0)
+ andi. r0,o0,NO_PREFETCH_MASK
+ beq pmark
+ endif
include 'pmark.a'
+ if PREFETCH
+ include 'pmark_prefetch.a'
+ endif
compact_gc:
lea o0,zero_bits_before_mark
@@ -3324,7 +3731,6 @@ compact_gc:
no_mark5:
endif
-
include 'pcompact.a'
lea o0,heap_size_33
@@ -3484,6 +3890,17 @@ vector_at_end_2:
no_copy_garbage_collection:
if MEASURE_GC
bl .add_compact_garbage_collect_time
+
+ sub d0,a6,d6
+
+ lea o0,total_compact_gc_bytes_lo
+ lwz o1,0(o0)
+ addc o1,o1,d0
+ stw o1,0(o0)
+ lea o0,total_compact_gc_bytes_hi
+ lwz o1,0(o0)
+ addze o1,o1
+ stw o1,0(o0)
else
bl .add_garbage_collect_time
endif
@@ -5223,6 +5640,7 @@ _st_fillr5_array:
bge _fillr5_array_1
blr
+ if !NEW_DESCRIPTORS
csect .yet_args_needed
yet_args_needed:
; for more than 4 arguments
@@ -5382,6 +5800,7 @@ gc_r_24:
gc_24: mflr r0
bl collect_2
b gc_r_24
+ endif
csect .repl_args_b
repl_args_b:
@@ -5982,6 +6401,9 @@ entier_real_2:
lwz RTOC,4(r3)
bctr
+ if NEW_DESCRIPTORS
+ include 'pap.a'
+ endif
if MACOSX
export .call_function_0{PR}
@@ -6129,6 +6551,10 @@ entier_real_2:
if MEASURE_GC
tc compact_garbage_collect_time{TC},compact_garbage_collect_time{BS}
tc mark_compact_garbage_collect_time{TC},mark_compact_garbage_collect_time{BS}
+ tc total_gc_bytes_lo{TC},total_gc_bytes_lo{BS}
+ tc total_gc_bytes_hi{TC},total_gc_bytes_hi{BS}
+ tc total_compact_gc_bytes_lo{TC},total_compact_gc_bytes_lo{BS}
+ tc total_compact_gc_bytes_hi{TC},total_compact_gc_bytes_hi{BS}
endif
tc heap_end_after_copy_gc{TC},heap_end_after_copy_gc{BS}
tc caf_listp{TC},caf_listp{BS}
@@ -6195,6 +6621,10 @@ entier_real_2:
if MEASURE_GC
te time_string_2a
endif
+ if PREFETCH
+ te queue
+ te rmarkp_queue
+ endif
te time_string_3
te time_string_4
te true_c_string
@@ -6202,6 +6632,11 @@ entier_real_2:
te zero_length_string
te garbage_collect_flag
te entier_constants_and_buffers
+ if MEASURE_GC
+ te f_power2_52
+ te f_60
+ te f_1000000
+ endif
if WRITE_HEAP
tc first_function{TC},first_function{DS}
@@ -6211,3 +6646,8 @@ entier_real_2:
if PROFILE
te garbage_collector_name
endif
+
+ export print_execution_time{DS}
+ csect print_execution_time{DS}
+ dc.l .print_execution_time{PR}
+ dc.l TOC{tc0}