summaryrefslogtreecommitdiff
path: root/macho/pcopy.a
diff options
context:
space:
mode:
authorJohn van Groningen2006-04-06 11:43:02 +0000
committerJohn van Groningen2006-04-06 11:43:02 +0000
commit4486c2a8ce6347b82c57369a099a6130887066bb (patch)
tree7917d76340c4873c0fb9312f6a98eeeac8265f71 /macho/pcopy.a
parentuse cr in cmp instructions (diff)
use new descriptors for Mach-O
Diffstat (limited to 'macho/pcopy.a')
-rw-r--r--macho/pcopy.a496
1 files changed, 460 insertions, 36 deletions
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