diff options
-rw-r--r-- | icompact_rmark.s | 144 | ||||
-rw-r--r-- | icompact_rmarkr.s | 110 | ||||
-rw-r--r-- | icopy.s | 126 | ||||
-rw-r--r-- | imark.s | 203 |
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 @@ -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 @@ -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: |