summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icompact_rmark.s144
-rw-r--r--icompact_rmarkr.s110
-rw-r--r--icopy.s126
-rw-r--r--imark.s203
4 files changed, 568 insertions, 15 deletions
diff --git a/icompact_rmark.s b/icompact_rmark.s
index 443bc5c..819ecf0 100644
--- a/icompact_rmark.s
+++ b/icompact_rmark.s
@@ -489,22 +489,59 @@ rmark_large_tuple_or_record:
bt d1,(a4)
jc rmark_hnf_1
#endif
-rmark_small_tuple_or_record:
+
+#ifdef NEW_DESCRIPTORS
movl neg_heap_p3,d1
lea -4(a0,d1),d1
pushl a0
-#ifdef NO_BIT_INSTRUCTIONS
+ movl -8(d0),d0
+
movl d1,a0
andl $31*4,a0
shrl $7,d1
movl bit_clear_table(a0),a0
andl a0,(a4,d1,4)
+
+ movzwl 4(d0),d0
+ movl pointer_compare_address,d1
+
+ cmpl $8,d0
+ jl rmark_tuple_or_record_selector_node_2
+ movl 8(a1),a1
+ je rmark_tuple_selector_node_2
+ movl -12(a1,d0),a0
+ pop a1
+ movl a0,(a3)
+ movl $__indirection,-4(a1)
+ movl a0,(a1)
+ jmp rmark_node_d1
+
+rmark_tuple_selector_node_2:
+ movl (a1),a0
+ pop a1
+ movl a0,(a3)
+ movl $__indirection,-4(a1)
+ movl a0,(a1)
+ jmp rmark_node_d1
#else
+rmark_small_tuple_or_record:
+ movl neg_heap_p3,d1
+ lea -4(a0,d1),d1
+
+ pushl a0
+
+# ifdef NO_BIT_INSTRUCTIONS
+ movl d1,a0
+ andl $31*4,a0
+ shrl $7,d1
+ movl bit_clear_table(a0),a0
+ andl a0,(a4,d1,4)
+# else
shrl $2,d1
btr d1,(a4)
-#endif
+# endif
movl -8(d0),d0
movl a1,a0
@@ -520,6 +557,7 @@ rmark_small_tuple_or_record:
movl $__indirection,-4(a1)
movl a0,(a1)
jmp rmark_node_d1
+#endif
rmark_record_selector_node_1:
je rmark_strict_record_selector_node_1
@@ -541,8 +579,53 @@ rmark_record_selector_node_1:
je rmark_hnf_1
cmpw $258,-2(d1)
+#ifdef NEW_DESCRIPTORS
+ jbe rmark_small_tuple_or_record
+
+ movl 8(a1),d1
+ addl neg_heap_p3,d1
+ shrl $2,d1
+
+ movl d1,a2
+ shrl $5,d1
+ andl $31,a2
+ movl bit_set_table(,a2,4),a2
+ movl (a4,d1,4),d1
+ andl a2,d1
+ jne rmark_hnf_1
+
+rmark_small_tuple_or_record:
+ movl neg_heap_p3,d1
+ lea -4(a0,d1),d1
+
+ pushl a0
+
+ movl -8(d0),d0
+
+ movl d1,a0
+ andl $31*4,a0
+ shrl $7,d1
+ movl bit_clear_table(a0),a0
+ andl a0,(a4,d1,4)
+
+ movzwl 4(d0),d0
+ movl pointer_compare_address,d1
+
+ cmpl $8,d0
+ jle rmark_tuple_or_record_selector_node_2
+ movl 8(a1),a1
+ subl $12,d0
+rmark_tuple_or_record_selector_node_2:
+ movl (a1,d0),a0
+ pop a1
+ movl a0,(a3)
+ movl $__indirection,-4(a1)
+ movl a0,(a1)
+ jmp rmark_node_d1
+#else
jbe rmark_small_tuple_or_record
jmp rmark_large_tuple_or_record
+#endif
rmark_strict_record_selector_node_1:
#ifdef NO_BIT_INSTRUCTIONS
@@ -587,6 +670,32 @@ rmark_select_from_small_record:
cmpl pointer_compare_address,a0
ja rmark_selector_pointer_not_reversed
+#ifdef NEW_DESCRIPTORS
+ movzwl 4(d1),d0
+ cmpl $8,d0
+ jle rmark_strict_record_selector_node_2
+ addl 8(a1),d0
+ movl -12(d0),d0
+ jmp rmark_strict_record_selector_node_3
+rmark_strict_record_selector_node_2:
+ movl (a1,d0),d0
+rmark_strict_record_selector_node_3:
+ movl d0,4(a0)
+
+ movzwl 6(d1),d0
+ testl d0,d0
+ je rmark_strict_record_selector_node_5
+ cmpl $8,d0
+ jle rmark_strict_record_selector_node_4
+ movl 8(a1),a1
+ subl $12,d0
+rmark_strict_record_selector_node_4:
+ movl (a1,d0),d0
+ movl d0,8(a0)
+rmark_strict_record_selector_node_5:
+
+ movl -4(d1),d0
+#else
movl d0,(a0)
movl a0,(a3)
@@ -595,13 +704,42 @@ rmark_select_from_small_record:
popl a3
movl (a0),d0
+#endif
addl $1,a3
movl a3,(a0)
movl d0,-1(a3)
jmp rmark_next_node
rmark_selector_pointer_not_reversed:
+#ifdef NEW_DESCRIPTORS
+ movzwl 4(d1),d0
+ cmpl $8,d0
+ jle rmark_strict_record_selector_node_6
+ addl 8(a1),d0
+ movl -12(d0),d0
+ jmp rmark_strict_record_selector_node_7
+rmark_strict_record_selector_node_6:
+ movl (a1,d0),d0
+rmark_strict_record_selector_node_7:
+ movl d0,4(a0)
+
+ movzwl 6(d1),d0
+ testl d0,d0
+ je rmark_strict_record_selector_node_9
+ cmpl $8,d0
+ jle rmark_strict_record_selector_node_8
+ movl 8(a1),a1
+ subl $12,d0
+rmark_strict_record_selector_node_8:
+ movl (a1,d0),d0
+ movl d0,8(a0)
+rmark_strict_record_selector_node_9:
+
+ movl -4(d1),d0
+ movl d0,(a0)
+#else
call *4(d1)
+#endif
jmp rmark_next_node
rmark_reverse_and_mark_next_node:
diff --git a/icompact_rmarkr.s b/icompact_rmarkr.s
index 972fcac..99e93ba 100644
--- a/icompact_rmarkr.s
+++ b/icompact_rmarkr.s
@@ -394,6 +394,39 @@ rmarkr_large_tuple_or_record:
bt d1,(a4)
jc rmarkr_hnf_1
#endif
+
+#ifdef NEW_DESCRIPTORS
+ movl neg_heap_p3,d1
+ lea -4(a0,d1),d1
+
+ push a0
+
+ movl -8(d0),d0
+
+ movl d1,a0
+ andl $31*4,a0
+ shrl $7,d1
+ movl bit_clear_table(a0),a0
+ andl a0,(a4,d1,4)
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jl rmarkr_tuple_or_record_selector_node_2
+ movl 8(a1),a1
+ je rmarkr_tuple_selector_node_2
+ movl -12(a1,d0),a0
+ pop a1
+ movl $__indirection,-4(a1)
+ movl a0,(a1)
+ jmp rmarkr_node
+
+rmarkr_tuple_selector_node_2:
+ movl (a1),a0
+ pop a1
+ movl $__indirection,-4(a1)
+ movl a0,(a1)
+ jmp rmarkr_node
+#else
rmarkr_small_tuple_or_record:
movl neg_heap_p3,d1
lea -4(a0,d1),d1
@@ -422,6 +455,7 @@ rmarkr_small_tuple_or_record:
movl a0,(a1)
jmp rmarkr_node
+#endif
rmarkr_record_selector_node_1:
je rmarkr_strict_record_selector_node_1
@@ -445,8 +479,52 @@ rmarkr_record_selector_node_1:
je rmarkr_hnf_1
cmpw $258,-2(d1)
+#ifdef NEW_DESCRIPTORS
+ jbe rmarkr_small_tuple_or_record
+
+ movl 8(a1),d1
+ addl neg_heap_p3,d1
+ shrl $2,d1
+
+ push d0
+ movl d1,d0
+ shrl $5,d1
+ andl $31,d0
+ movl bit_set_table(,d0,4),d0
+ movl (a4,d1,4),d1
+ andl d0,d1
+ pop d0
+ jne rmarkr_hnf_1
+
+rmarkr_small_tuple_or_record:
+ movl neg_heap_p3,d1
+ lea -4(a0,d1),d1
+
+ push a0
+
+ movl -8(d0),d0
+
+ movl d1,a0
+ andl $31*4,a0
+ shrl $7,d1
+ movl bit_clear_table(a0),a0
+ andl a0,(a4,d1,4)
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jle rmarkr_tuple_or_record_selector_node_2
+ movl 8(a1),a1
+ subl $12,d0
+rmarkr_tuple_or_record_selector_node_2:
+ movl (a1,d0),a0
+ pop a1
+ movl $__indirection,-4(a1)
+ movl a0,(a1)
+ jmp rmarkr_node
+#else
jbe rmarkr_small_tuple_or_record
jmp rmarkr_large_tuple_or_record
+#endif
rmarkr_strict_record_selector_node_1:
#ifdef NO_BIT_INSTRUCTIONS
@@ -489,12 +567,38 @@ rmarkr_strict_record_selector_node_1:
#endif
rmarkr_select_from_small_record:
-/ changed 24-1-97
movl -8(d0),d0
subl $4,a0
-
- call *4(d0)
+#ifdef NEW_DESCRIPTORS
+ movzwl 4(d0),d1
+ cmpl $8,d1
+ jle rmarkr_strict_record_selector_node_2
+ addl 8(a1),d1
+ movl -12(d1),d1
+ jmp rmarkr_strict_record_selector_node_3
+rmarkr_strict_record_selector_node_2:
+ movl (a1,d1),d1
+rmarkr_strict_record_selector_node_3:
+ movl d1,4(a0)
+
+ movzwl 6(d0),d1
+ testl d1,d1
+ je rmarkr_strict_record_selector_node_5
+ cmpl $8,d1
+ jle rmarkr_strict_record_selector_node_4
+ movl 8(a1),a1
+ subl $12,d1
+rmarkr_strict_record_selector_node_4:
+ movl (a1,d1),d1
+ movl d1,8(a0)
+rmarkr_strict_record_selector_node_5:
+
+ movl -4(d0),d0
+ movl d0,(a0)
+#else
+ call *4(d0)
+#endif
jmp rmarkr_next_node
/ a2,d1: free
diff --git a/icopy.s b/icopy.s
index 89b3f8e..36c614c 100644
--- a/icopy.s
+++ b/icopy.s
@@ -674,6 +674,10 @@ cp_arg_lp2:
jae copy_lp2
ret
+#ifdef NEW_DESCRIPTORS
+copy_arity_1_node2__:
+ pop d1
+#endif
copy_arity_1_node2:
copy_arity_1_node2_:
mov a4,(a2)
@@ -733,12 +737,66 @@ update_indirection_list_2:
jmp continue_after_selector_2
copy_selector_2:
- add $2,d0
+ cmpl $-2,d0
je copy_indirection_2
jl copy_record_selector_2
mov 4(a1),d0
+#ifdef NEW_DESCRIPTORS
+ push d1
+
+ mov (d0),d1
+ testb $2,d1b
+ je copy_arity_1_node2__
+
+ cmpw $2,-2(d1)
+ jbe copy_selector_2_
+
+ movl 8(d0),d1
+ testb $1,(d1)
+ jne copy_arity_1_node2__
+
+ movl -8(a0),a0
+
+ movzwl 4(a0),a0
+ movl $__indirection,(a1)
+
+ cmpl $8,a0
+ jl copy_selector_2_1
+ je copy_selector_2_2
+
+ movl -12(d1,a0),a0
+ pop d1
+ movl a0,4(a1)
+ movl a0,a1
+ jmp continue_after_selector_2
+
+copy_selector_2_1:
+ movl 4(d0),a0
+ pop d1
+ movl a0,4(a1)
+ movl a0,a1
+ jmp continue_after_selector_2
+
+copy_selector_2_2:
+ movl (d1),a0
+ pop d1
+ movl a0,4(a1)
+ movl a0,a1
+ jmp continue_after_selector_2
+copy_selector_2_:
+ movl -8(a0),a0
+ pop d1
+
+ movzwl 4(a0),a0
+ movl $__indirection,(a1)
+
+ movl (d0,a0),a0
+ movl a0,4(a1)
+ movl a0,a1
+ jmp continue_after_selector_2
+#else
mov (d0),d0
testb $2,d0b
je copy_arity_1_node2_
@@ -766,9 +824,10 @@ copy_selector_2_:
mov a0,a1
jmp continue_after_selector_2
+#endif
copy_record_selector_2:
- addl $1,d0
+ cmpl $-3,d0
movl 4(a1),d0
movl (d0),d0
je copy_strict_record_selector_2
@@ -777,7 +836,11 @@ copy_record_selector_2:
je copy_arity_1_node2_
cmpw $258,-2(d0)
+#ifdef NEW_DESCRIPTORS
+ jbe copy_record_selector_2_
+#else
jbe copy_selector_2_
+#endif
movl 4(a1),d0
pushl a1
@@ -803,7 +866,27 @@ copy_record_selector_2:
jne copy_arity_1_node2_
+#ifdef NEW_DESCRIPTORS
+copy_record_selector_2_:
+ movl -8(a0),d0
+ movl 4(a1),a0
+ movl $__indirection,(a1)
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jle copy_record_selector_3
+ movl 8(a0),a0
+ subl $12,d0
+copy_record_selector_3:
+ movl (a0,d0),a0
+
+ movl a0,4(a1)
+
+ movl a0,a1
+ jmp continue_after_selector_2
+#else
jmp copy_selector_2_
+#endif
copy_strict_record_selector_2:
testb $2,d0b
@@ -837,11 +920,45 @@ copy_strict_record_selector_2:
jne copy_arity_1_node2_
copy_strict_record_selector_2_:
- mov -8(a0),d0
+ movl -8(a0),d0
+#ifdef NEW_DESCRIPTORS
+ push d1
+ movl 4(a1),a0
+
+ movzwl 4(d0),d1
+ cmpl $8,d1
+ jle copy_strict_record_selector_3
+ addl 8(a0),d1
+ movl -12(d1),d1
+ jmp copy_strict_record_selector_4
+copy_strict_record_selector_3:
+ movl (a0,d1),d1
+copy_strict_record_selector_4:
+ movl d1,4(a1)
+
+ movzwl 6(d0),d1
+ testl d1,d1
+ je copy_strict_record_selector_6
+ cmpl $8,d1
+ jle copy_strict_record_selector_5
+ movl 8(a0),a0
+ subl $12,d1
+copy_strict_record_selector_5:
+ movl (a0,d1),d1
+ movl d1,8(a1)
+copy_strict_record_selector_6:
+
+ movl -4(d0),a0
+ movl a0,(a1)
+ pop d1
+ testb $2,a0b
+ jne in_hnf_2
+ hlt
+#else
movl a1,a0
movl 4(a1),a1
-
+
push a2
call *4(d0)
pop a2
@@ -851,6 +968,7 @@ copy_strict_record_selector_2_:
testb $2,a0b
jne in_hnf_2
hlt
+#endif
copy_arity_0_node2_:
jl copy_selector_2
diff --git a/imark.s b/imark.s
index a0c1548..754fca1 100644
--- a/imark.s
+++ b/imark.s
@@ -617,7 +617,7 @@ fits_in_word_3:
je _mark_node2
_mark_selector_node_1:
- addl $2,a2
+ cmpl $-2,a2
movl (a0),a1
je _mark_indirection_node
@@ -628,7 +628,7 @@ _mark_selector_node_1:
shrl $7,d1
andl $31*4,a3
- addl $1,a2
+ cmpl $-3,a2
movl bit_set_table(a3),a3
jle _mark_record_selector_node_1
@@ -653,7 +653,37 @@ _large_tuple_or_record:
testl (a4,d1,4),a2
jne _mark_node3
+#ifdef NEW_DESCRIPTORS
+ movl -8(d0),d0
+ movl $__indirection,-4(a0)
+ movl a0,a2
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jl _mark_tuple_selector_node_1
+ movl 8(a1),a1
+ je _mark_tuple_selector_node_2
+ movl -12(a1,d0),a0
+ movl a0,(a2)
+ jmp _mark_node
+
+_mark_tuple_selector_node_2:
+ movl (a1),a0
+ movl a0,(a2)
+ jmp _mark_node
+#endif
+
_small_tuple_or_record:
+#ifdef NEW_DESCRIPTORS
+ movl -8(d0),d0
+ movl $__indirection,-4(a0)
+ movl a0,a2
+
+ movzwl 4(d0),d0
+_mark_tuple_selector_node_1:
+ movl (a1,d0),a0
+ movl a0,(a2)
+#else
movl -8(d0),d0
pushl a0
movl a1,a0
@@ -662,6 +692,7 @@ _small_tuple_or_record:
movl $__indirection,-4(a1)
movl a0,(a1)
+#endif
jmp _mark_node
_mark_record_selector_node_1:
@@ -675,8 +706,36 @@ _mark_record_selector_node_1:
je _mark_node3
cmpw $258,-2(a2)
+#ifdef NEW_DESCRIPTORS
+ jbe _small_tuple_or_record
+
+ movl 8(a1),a2
+ addl neg_heap_p3,a2
+ movl a2,d1
+ andl $31*4,a2
+ shrl $7,d1
+ movl bit_set_table(a2),a2
+ testl (a4,d1,4),a2
+ jne _mark_node3
+
+ movl -8(d0),d0
+ movl $__indirection,-4(a0)
+ movl a0,a2
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jle _mark_record_selector_node_2
+ movl 8(a1),a1
+ subl $12,d0
+_mark_record_selector_node_2:
+ movl (a1,d0),a0
+
+ movl a0,(a2)
+ jmp _mark_node
+#else
jbe _small_tuple_or_record
jmp _large_tuple_or_record
+#endif
_mark_strict_record_selector_node_1:
testl (a4,d1,4),a3
@@ -700,10 +759,40 @@ _mark_strict_record_selector_node_1:
_select_from_small_record:
movl -8(d0),d0
+
+#ifdef NEW_DESCRIPTORS
subl $4,a0
+
+ movzwl 4(d0),d1
+ cmpl $8,d1
+ jle _mark_strict_record_selector_node_2
+ addl 8(a1),d1
+ movl -12(d1),d1
+ jmp _mark_strict_record_selector_node_3
+_mark_strict_record_selector_node_2:
+ movl (a1,d1),d1
+_mark_strict_record_selector_node_3:
+ movl d1,4(a0)
- call *4(d0)
+ movzwl 6(d0),d1
+ testl d1,d1
+ je _mark_strict_record_selector_node_5
+ cmpl $8,d1
+ jle _mark_strict_record_selector_node_4
+ movl 8(a1),a1
+ subl $12,d1
+_mark_strict_record_selector_node_4:
+ movl (a1,d1),d1
+ movl d1,8(a0)
+_mark_strict_record_selector_node_5:
+
+ movl -4(d0),d0
+ movl d0,(a0)
+#else
+ subl $4,a0
+ call *4(d0)
+#endif
jmp _mark_next_node
_mark_indirection_node:
@@ -1259,10 +1348,10 @@ __mark_lazy_node_1:
je __mark_no_selector_1
__mark_selector_node_1:
- addl $2,a2
+ cmpl $-2,a2
je __mark_indirection_node
- addl $1,a2
+ cmpl $-3,a2
pushl d1
movl (a0),a2
@@ -1298,7 +1387,44 @@ __large_tuple_or_record:
testl (a4,d1,4),a2
jne __mark_no_selector_2
+#ifdef NEW_DESCRIPTORS
+ movl -8(d0),d0
+ movl (a0),a1
+ movl $__indirection,-4(a0)
+ movl a0,a2
+
+ popl d1
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jl __mark_tuple_selector_node_1
+ movl 8(a1),a1
+ je __mark_tuple_selector_node_2
+ subl $12,d0
+ movl (a1,d0),a0
+ movl a0,(a2)
+ jmp __mark_node
+
+__mark_tuple_selector_node_2:
+ movl (a1),a0
+ movl a0,(a2)
+ jmp __mark_node
+#endif
+
__small_tuple_or_record:
+#ifdef NEW_DESCRIPTORS
+ movl -8(d0),d0
+ movl (a0),a1
+ movl $__indirection,-4(a0)
+ movl a0,a2
+
+ popl d1
+
+ movzwl 4(d0),d0
+__mark_tuple_selector_node_1:
+ movl (a1,d0),a0
+ movl a0,(a2)
+#else
movl -8(d0),d0
popl d1
@@ -1309,6 +1435,7 @@ __small_tuple_or_record:
movl $__indirection,-4(a1)
movl a0,(a1)
+#endif
jmp __mark_node
__mark_record_selector_node_1:
@@ -1328,8 +1455,41 @@ __mark_record_selector_node_1:
je __mark_no_selector_2
cmpw $258,-2(d1)
+#ifdef NEW_DESCRIPTORS
+ jbe __small_record
+
+ movl 8(a2),a2
+ movl neg_heap_p3,d1
+ addl d1,a2
+ movl a2,d1
+ andl $31*4,a2
+ shrl $7,d1
+ movl bit_set_table(a2),a2
+ testl (a4,d1,4),a2
+ jne __mark_no_selector_2
+
+__small_record:
+ movl -8(d0),d0
+ movl (a0),a1
+ movl $__indirection,-4(a0)
+ movl a0,a2
+
+ popl d1
+
+ movzwl 4(d0),d0
+ cmpl $8,d0
+ jle __mark_record_selector_node_2
+ movl 8(a1),a1
+ subl $12,d0
+__mark_record_selector_node_2:
+ movl (a1,d0),a0
+
+ movl a0,(a2)
+ jmp __mark_node
+#else
jbe __small_tuple_or_record
jmp __large_tuple_or_record
+#endif
__mark_strict_record_selector_node_1:
addl a2,d0
@@ -1359,11 +1519,44 @@ __mark_strict_record_selector_node_1:
jne __mark_no_selector_2
__select_from_small_record:
+#ifdef NEW_DESCRIPTORS
+ movl -8(d0),d0
+ movl (a0),a1
+ popl d1
+ subl $4,a0
+
+ movzwl 4(d0),d1
+ cmpl $8,d1
+ jle __mark_strict_record_selector_node_2
+ addl 8(a1),d1
+ movl -12(d1),d1
+ jmp __mark_strict_record_selector_node_3
+__mark_strict_record_selector_node_2:
+ movl (a1,d1),d1
+__mark_strict_record_selector_node_3:
+ movl d1,4(a0)
+
+ movzwl 6(d0),d1
+ testl d1,d1
+ je __mark_strict_record_selector_node_5
+ cmpl $8,d1
+ jle __mark_strict_record_selector_node_4
+ movl 8(a1),a1
+ subl $12,d1
+__mark_strict_record_selector_node_4:
+ movl (a1,d1),d1
+ movl d1,8(a0)
+__mark_strict_record_selector_node_5:
+
+ movl -4(d0),d0
+ movl d0,(a0)
+#else
movl -8(d0),d0
popl d1
movl (a0),a1
subl $4,a0
call *4(d0)
+#endif
jmp __mark_node
__mark_indirection_node: