diff options
author | John van Groningen | 2006-04-25 09:43:25 +0000 |
---|---|---|
committer | John van Groningen | 2006-04-25 09:43:25 +0000 |
commit | 2a70ef1db7390441ee5335af4f9325f8a612a30e (patch) | |
tree | aaa4ad60dc821cdb6820300926e5af6cfd990308 | |
parent | fix a compare instruction for strict record selectors (diff) |
change descriptors for record selectors,
optimize apply with >1 argument
-rw-r--r-- | sap.s | 2643 | ||||
-rw-r--r-- | scompact.s | 189 | ||||
-rw-r--r-- | scopy.s | 307 | ||||
-rw-r--r-- | smark.s | 224 | ||||
-rw-r--r-- | sstartup.s | 76 |
5 files changed, 3322 insertions, 117 deletions
@@ -0,0 +1,2643 @@ + + .text + + .global ap_2 + .global ap_3 + .global ap_4 + .global ap_5 + .global ap_6 + .global ap_7 + .global ap_8 + .global ap_9 + .global ap_10 + .global ap_11 + .global ap_12 + .global ap_13 + .global ap_14 + .global ap_15 + .global ap_16 + .global ap_17 + .global ap_18 + .global ap_19 + .global ap_20 + .global ap_21 + .global ap_22 + .global ap_23 + .global ap_24 + .global ap_25 + .global ap_26 + .global ap_27 + .global ap_28 + .global ap_29 + .global ap_30 + .global ap_31 + .global ap_32 + + .global add_empty_node_2 + .global add_empty_node_3 + .global add_empty_node_4 + .global add_empty_node_5 + .global add_empty_node_6 + .global add_empty_node_7 + .global add_empty_node_8 + .global add_empty_node_9 + .global add_empty_node_10 + .global add_empty_node_11 + .global add_empty_node_12 + .global add_empty_node_13 + .global add_empty_node_14 + .global add_empty_node_15 + .global add_empty_node_16 + .global add_empty_node_17 + .global add_empty_node_18 + .global add_empty_node_19 + .global add_empty_node_20 + .global add_empty_node_21 + .global add_empty_node_22 + .global add_empty_node_23 + .global add_empty_node_24 + .global add_empty_node_25 + .global add_empty_node_26 + .global add_empty_node_27 + .global add_empty_node_28 + .global add_empty_node_29 + .global add_empty_node_30 + .global add_empty_node_31 + .global add_empty_node_32 + + .global yet_args_needed_5 + .global yet_args_needed_6 + .global yet_args_needed_7 + .global yet_args_needed_8 + .global yet_args_needed_9 + .global yet_args_needed_10 + .global yet_args_needed_11 + .global yet_args_needed_12 + .global yet_args_needed_13 + .global yet_args_needed_14 + .global yet_args_needed_15 + .global yet_args_needed_16 + .global yet_args_needed_17 + .global yet_args_needed_18 + .global yet_args_needed_19 + .global yet_args_needed_20 + .global yet_args_needed_21 + .global yet_args_needed_22 + .global yet_args_needed_23 + .global yet_args_needed_24 + .global yet_args_needed_25 + .global yet_args_needed_26 + .global yet_args_needed_27 + .global yet_args_needed_28 + .global yet_args_needed_29 + .global yet_args_needed_30 + .global yet_args_needed_31 + +ap_32: + ld [a2],a3 + set 32*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap32 + inc 4,a4 + +ap_31: + ld [a2],a3 + set 31*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap31 + inc 4,a4 + +ap_30: + ld [a2],a3 + set 30*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap30 + inc 4,a4 + +ap_29: + ld [a2],a3 + set 29*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap29 + inc 4,a4 + +ap_28: + ld [a2],a3 + set 28*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap28 + inc 4,a4 + +ap_27: + ld [a2],a3 + set 27*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap27 + inc 4,a4 + +ap_26: + ld [a2],a3 + set 26*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap26 + inc 4,a4 + +ap_25: + ld [a2],a3 + set 25*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap25 + inc 4,a4 + +ap_24: + ld [a2],a3 + set 24*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap24 + inc 4,a4 + +ap_23: + ld [a2],a3 + set 23*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap23 + inc 4,a4 + +ap_22: + ld [a2],a3 + set 22*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap22 + inc 4,a4 + +ap_21: + ld [a2],a3 + set 21*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap21 + inc 4,a4 + +ap_20: + ld [a2],a3 + set 20*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap20 + inc 4,a4 + +ap_19: + ld [a2],a3 + set 19*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap19 + inc 4,a4 + +ap_18: + ld [a2],a3 + set 18*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap18 + inc 4,a4 + +ap_17: + ld [a2],a3 + set 17*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap17 + inc 4,a4 + +ap_16: + ld [a2],a3 + set 16*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap16 + inc 4,a4 + +ap_15: + ld [a2],a3 + set 15*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap15 + inc 4,a4 + +ap_14: + ld [a2],a3 + set 14*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap14 + inc 4,a4 + +ap_13: + ld [a2],a3 + set 13*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap13 + inc 4,a4 + +ap_12: + ld [a2],a3 + set 12*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap12 + inc 4,a4 + +ap_11: + ld [a2],a3 + set 11*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap11 + inc 4,a4 + +ap_10: + ld [a2],a3 + set 10*80,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap10 + inc 4,a4 + +ap_9: + ld [a2],a3 + set 9*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap9 + inc 4,a4 + +ap_8: + ld [a2],a3 + set 8*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap8 + inc 4,a4 + +ap_7: + ld [a2],a3 + set 7*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap7 + inc 4,a4 + +ap_6: + ld [a2],a3 + set 6*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap6 + inc 4,a4 + +ap_5: + ld [a2],a3 + set 5*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap5 + inc 4,a4 + +ap_4: + ld [a2],a3 + set 4*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap4 + inc 4,a4 + +ap_3: + ld [a2],a3 + set 3*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq,a fast_ap_ + lduh [a3-2],d0 + + st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap3 + inc 4,a4 + +ap_2: + ld [a2],a3 + set 2*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + bne,a no_fast_ap2_ + st a0,[a4] + +fast_ap_2_2_: + lduh [a3-2],d0 + add d1,a3,d1 + ld [d1-6],a3 +#ifdef PROFILE + dec 32,a3 +#else + dec 16,a3 +#endif + cmp d0,1 + bltu repl_args_0_2 + nop + beq repl_args_1 + cmp d0,3 + bltu repl_args_2 + nop + + st a0,[a4] + st a1,[a4+4] + inc 8,a4 + ba fast_ap__ + ld [a2+8],a1 + + +no_fast_ap2_: +! st a0,[a4] + mov a1,a0 + mov a2,a1 + ld [a3+2],a2 + ba no_fast_ap2 + inc 4,a4 + +fast_ap_2_2: + mov a1,a2 + mov a0,a1 + ld [a4-4],a0 + ba fast_ap_2_2_ + dec 4,a4 + +fast_ap_2: + mov a1,a2 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + +fast_ap: + lduh [a3-2],d0 +fast_ap_: + add d1,a3,d1 + ld [d1-6],a3 +#ifdef PROFILE + dec 32,a3 +#else + dec 16,a3 +#endif + cmp d0,1 + bltu repl_args_0 + nop + beq repl_args_1 + cmp d0,3 + bltu repl_args_2 + nop + + st a0,[a4] + st a1,[a4+4] + inc 8,a4 + ld [a2+8],a1 + +fast_ap__: + ld [a2+4],a2 + beq repl_args_3 + + cmp d0,5 + bltu repl_args_4 + nop + beq repl_args_5 + cmp d0,7 + bltu repl_args_6 + nop + + sll d0,2,d0 + dec 8,d0 + +repl_args_7_: + ld [a1+d0],%o0 + st %o0,[a4] + dec 4,d0 + cmp d0,(6*4)-8 + bne repl_args_7_ + inc 4,a4 + +repl_args_6: + ld [a1+16],d0 + st d0,[a4] + ld [a1+12],d0 + st d0,[a4+4] + ld [a1+8],d0 + st d0,[a4+8] + ld [a1+4],a0 + ld [a1],a1 + jmp a3 + inc 12,a4 + +repl_args_0_2: + jmp a3 + nop + +repl_args_0: + mov a1,a2 + mov a0,a1 + ld [a4-4],a0 + jmp a3 + dec 4,a4 + +repl_args_1: + jmp a3 + ld [a2+4],a2 + +repl_args_2: + st a0,[a4] + mov a1,a0 + ld [a2+8],a1 + ld [a2+4],a2 + jmp a3 + inc 4,a4 + +repl_args_3: + ld [a1+4],a0 + jmp a3 + ld [a1],a1 + +repl_args_4: + ld [a1+8],d0 + st d0,[a4] + ld [a1+4],a0 + ld [a1],a1 + jmp a3 + inc 4,a4 + +repl_args_5: + ld [a1+12],d0 + st d0,[a4] + ld [a1+8],d0 + st d0,[a4+4] + ld [a1+4],a0 + ld [a1],a1 + jmp a3 + inc 8,a4 + +no_fast_ap32: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 31*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap31: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 30*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap30: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 29*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap29: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 28*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap28: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 27*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap27: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 26*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap26: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 25*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap25: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 24*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap24: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 23*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap23: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 22*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap22: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 21*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap21: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 20*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap20: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 19*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap19: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 18*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap18: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 17*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap17: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 16*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap16: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 16*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + set 15*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap15: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 14*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap14: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 13*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap13: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 12*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap12: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 11*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap11: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + ld [a3+2],a2 + + set 10*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap10: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 9*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap9: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 8*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap8: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 7*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap7: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 6*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap6: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 5*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap5: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 4*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap4: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + + set 3*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2 + + ld [a3+2],a2 +no_fast_ap3: + dec 4,sp + call a2 + st %o7,[sp] + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + + set 2*8,d1 + lduh [a3],%o1 + cmp %o1,d1 + beq fast_ap_2_2 + dec 4,a4 + + ld [a3+2],a2 +no_fast_ap2: + dec 4,sp + call a2 + st %o7,[sp] + + + ld [a0],a3 + mov a0,a1 + ld [a4-4],a0 + dec 4,a4 + ld [a3+2],a2 + + ld [sp],%o7 + retl + inc 4,sp + +add_empty_node_2: + deccc 3,d7 + bltu add_empty_node_2_gc + nop +add_empty_node_2_gc_: + st a5,[a6] + mov a1,a2 + mov a0,a1 + mov a6,a0 + inc 12,a6 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_2_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_2_gc_ + +add_empty_node_3: + deccc 3,d7 + bltu add_empty_node_3_gc + nop +add_empty_node_3_gc_: + st a5,[a6] + st a6,[a4] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_3_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_3_gc_ + +add_empty_node_4: + deccc 3,d7 + bltu add_empty_node_4_gc + nop +add_empty_node_4_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + st a5,[a6] + st a6,[a4-4] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_4_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_4_gc_ + +add_empty_node_5: + deccc 3,d7 + bltu add_empty_node_5_gc + nop +add_empty_node_5_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + st a5,[a6] + st a6,[a4-8] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_5_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_5_gc_ + +add_empty_node_6: + deccc 3,d7 + bltu add_empty_node_6_gc + nop +add_empty_node_6_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] + st a5,[a6] + st a6,[a4-12] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_6_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_6_gc_ + +add_empty_node_7: + deccc 3,d7 + bltu add_empty_node_7_gc + nop +add_empty_node_7_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] + ld [a4-16],a3 + st a3,[a4-12] + st a5,[a6] + st a6,[a4-16] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_7_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_7_gc_ + +add_empty_node_8: + deccc 3,d7 + bltu add_empty_node_8_gc + nop +add_empty_node_8_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] + ld [a4-16],a3 + st a3,[a4-12] + ld [a4-20],a3 + st a3,[a4-16] + st a5,[a6] + st a6,[a4-20] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_8_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_8_gc_ + + +add_empty_node_9: + deccc 3,d7 + bltu add_empty_node_9_gc + nop +add_empty_node_9_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] + ld [a4-16],a3 + st a3,[a4-12] + ld [a4-20],a3 + st a3,[a4-16] + ld [a4-24],a3 + st a3,[a4-20] + st a5,[a6] + st a6,[a4-24] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_9_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_9_gc_ + +add_empty_node_10: + deccc 3,d7 + bltu add_empty_node_10_gc + nop +add_empty_node_10_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] + ld [a4-16],a3 + st a3,[a4-12] + ld [a4-20],a3 + st a3,[a4-16] + ld [a4-24],a3 + st a3,[a4-20] + ld [a4-28],a3 + st a3,[a4-24] + st a5,[a6] + st a6,[a4-28] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_10_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_10_gc_ + +add_empty_node_11: + deccc 3,d7 + bltu add_empty_node_11_gc + nop +add_empty_node_11_gc_: + ld [a4-4],a3 + dec 4,a4 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] + ld [a4-16],a3 + st a3,[a4-12] + ld [a4-20],a3 + st a3,[a4-16] + ld [a4-24],a3 + st a3,[a4-20] + ld [a4-28],a3 + st a3,[a4-24] + ld [a4-32],a3 + st a3,[a4-28] + st a5,[a6] + st a6,[a4-32] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_11_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_11_gc_ + +add_empty_node_32: + ba add_empty_node_12_ + mov 7,d1 + +add_empty_node_28: + ba add_empty_node_12_ + mov 6,d1 + +add_empty_node_24: + ba add_empty_node_12_ + mov 5,d1 + +add_empty_node_20: + ba add_empty_node_12_ + mov 4,d1 + +add_empty_node_16: + ba add_empty_node_12_ + mov 3,d1 + +add_empty_node_12: + mov 2,d1 +add_empty_node_12_: + deccc 3,d7 + bltu add_empty_node_12_gc + nop +add_empty_node_12_gc_: + mov a4,d0 +add_empty_node_12_lp: + ld [d0-4],a3 + st a3,[d0] + ld [d0-8],a3 + st a3,[d0-4] + ld [d0-12],a3 + st a3,[d0-8] + ld [d0-16],a3 + st a3,[d0-12] + deccc 1,d1 + bne add_empty_node_12_lp + dec 16,d0 + + st a5,[a6] + st a6,[d0] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_12_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_12_gc_ + +add_empty_node_29: + ba add_empty_node_13_ + mov 6,d1 + +add_empty_node_25: + ba add_empty_node_13_ + mov 5,d1 + +add_empty_node_21: + ba add_empty_node_13_ + mov 4,d1 + +add_empty_node_17: + ba add_empty_node_13_ + mov 3,d1 + +add_empty_node_13: + mov 2,d1 +add_empty_node_13_: + deccc 3,d7 + bltu add_empty_node_13_gc + nop +add_empty_node_13_gc_: + mov a4,d0 + ld [a4-4],a3 + st a3,[a4] +add_empty_node_13_lp: + ld [d0-8],a3 + st a3,[d0-4] + ld [d0-12],a3 + st a3,[d0-8] + ld [d0-16],a3 + st a3,[d0-12] + ld [d0-20],a3 + st a3,[d0-16] + deccc 1,d1 + bne add_empty_node_13_lp + dec 16,d0 + + st a5,[a6] + st a6,[d0-4] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_13_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_13_gc_ + +add_empty_node_30: + ba add_empty_node_14_ + mov 6,d1 + +add_empty_node_26: + ba add_empty_node_14_ + mov 5,d1 + +add_empty_node_22: + ba add_empty_node_14_ + mov 4,d1 + +add_empty_node_18: + ba add_empty_node_14_ + mov 3,d1 + +add_empty_node_14: + mov 2,d1 +add_empty_node_14_: + deccc 3,d7 + bltu add_empty_node_14_gc + nop +add_empty_node_14_gc_: + mov a4,d0 + ld [a4-4],a3 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] +add_empty_node_14_lp: + ld [d0-12],a3 + st a3,[d0-8] + ld [d0-16],a3 + st a3,[d0-12] + ld [d0-20],a3 + st a3,[d0-16] + ld [d0-24],a3 + st a3,[d0-20] + deccc 1,d1 + bne add_empty_node_14_lp + dec 16,d0 + + st a5,[a6] + st a6,[d0-8] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_14_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_14_gc_ + +add_empty_node_31: + ba add_empty_node_15_ + mov 6,d1 + +add_empty_node_27: + ba add_empty_node_15_ + mov 5,d1 + +add_empty_node_23: + ba add_empty_node_15_ + mov 4,d1 + +add_empty_node_19: + ba add_empty_node_15_ + mov 3,d1 + +add_empty_node_15: + mov 2,d1 +add_empty_node_15_: + deccc 3,d7 + bltu add_empty_node_15_gc + nop +add_empty_node_15_gc_: + mov a4,d0 + ld [a4-4],a3 + st a3,[a4] + ld [a4-8],a3 + st a3,[a4-4] + ld [a4-12],a3 + st a3,[a4-8] +add_empty_node_15_lp: + ld [d0-16],a3 + st a3,[d0-12] + ld [d0-20],a3 + st a3,[d0-16] + ld [d0-24],a3 + st a3,[d0-20] + ld [d0-28],a3 + st a3,[d0-24] + deccc 1,d1 + bne add_empty_node_15_lp + dec 16,d0 + + st a5,[a6] + st a6,[d0-12] + inc 12,a6 + inc 4,a4 + ld [sp],%o7 + retl + inc 4,sp +add_empty_node_15_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a add_empty_node_15_gc_ + + +yet_args_needed_0: + deccc 2,d7 + bltu yet_args_needed_0_gc + nop +yet_args_needed_0_gc_r: + st a0,[a6+4] + inc 8,a6 + ld [a1],d0 + sub a6,8,a0 + inc 8,d0 + st d0,[a6-8] + + ld [sp],%o7 + retl + inc 4,sp + +yet_args_needed_0_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a yet_args_needed_0_gc_r + + + deccc 3,d7 + bgeu,a build_node_2 + st d1,[a6] + ba,a build_node_2_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_1: + deccc 3,d7 + bltu yet_args_needed_1_gc + nop +yet_args_needed_1_gc_r: + st a0,[a6+8] + ld [a1],d0 + mov a6,a0 + inc 8,d0 + st d0,[a6] + ld [a1+4],d1 + st d1,[a6+4] + inc 12,a6 + + ld [sp],%o7 + retl + inc 4,sp + +yet_args_needed_1_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a yet_args_needed_1_gc_r + +build_node_2: + st a1,[a6+4] + st a0,[a6+8] + mov a6,a0 + inc 12,a6 + ld [sp],%o7 + retl + inc 4,sp + +build_node_2_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba build_node_2 + st d1,[a6] + + deccc 5,d7 + bgeu,a build_node_3 + st d1,[a6] + ba,a build_node_3_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_2: + deccc 5,d7 + bltu yet_args_needed_2_gc + nop +yet_args_needed_2_gc_r: + ld [a1],d0 + st a0,[a6+4] + inc 8,d0 + ld [a1+4],d2 + st d0,[a6+8] + add a6,8,a0 + ld [a1+8],%o0 + st d2,[a6+12] + st %o0,[a6] + st a6,[a6+16] + inc 20,a6 + + ld [sp],%o7 + retl + inc 4,sp + +yet_args_needed_2_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a yet_args_needed_2_gc_r + +build_node_3: + st a2,[a6+4] + st a1,[a6+12] + inc 12,a6 + st a6,[a6-4] + st a0,[a6+4] + sub a6,12,a0 + inc 8,a6 + ld [sp],%o7 + retl + inc 4,sp + +build_node_3_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_3 + st d1,[a6] + + deccc 6,d7 + bgeu,a build_node_4 + st d1,[a6] + ba,a build_node_4_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_3: + deccc 6,d7 + bltu yet_args_needed_2_gc + nop +yet_args_needed_3_gc_r: + ld [a1],d0 + st a0,[a6+8] + inc 8,d0 + ld [a1+4],d2 + st d0,[a6+12] + ld [a1+8],a1 + st d2,[a6+16] + ld [a1],%o0 + ld [a1+4],%o1 + st %o0,[a6] + st a6,[a6+20] + add a6,12,a0 + st %o1,[a6+4] + inc 24,a6 + + ld [sp],%o7 + retl + inc 4,sp + +yet_args_needed_3_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a yet_args_needed_3_gc_r + +build_node_4: + st a2,[a6+4] + st a1,[a6+12] + inc 12,a6 + st a6,[a6-4] + st a0,[a6+4] + sub a6,12,a0 + ld [a4-4],a2 + dec 4,a4 + st a2,[a6+8] + inc 12,a6 + ld [sp],%o7 + retl + inc 4,sp + +build_node_4_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_4 + st d1,[a6] + + deccc 7,d7 + bgeu,a build_node_5 + st d1,[a6] + ba,a build_node_5_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_4: + deccc 7,d7 + bltu yet_args_needed_4_gc + nop +yet_args_needed_4_gc_r: + ld [a1],d0 + st a0,[a6+12] + inc 8,d0 + ld [a1+4],d2 + st d0,[a6+16] + ld [a1+8],a1 + st d2,[a6+20] + ld [a1],%o0 + ld [a1+4],%o1 + st %o0,[a6] + st a6,[a6+24] + add a6,16,a0 + ld [a1+8],%o2 + st %o1,[a6+4] + st %o2,[a6+8] + inc 28,a6 + + ld [sp],%o7 + retl + inc 4,sp + +yet_args_needed_4_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a yet_args_needed_4_gc_r + +build_node_5: + st a2,[a6+4] + st a1,[a6+12] + inc 12,a6 + st a6,[a6-4] + st a0,[a6+4] + sub a6,16,a0 + ld [a4-4],a2 + st a2,[a6+8] + ld [a4-8],a2 + dec 8,a4 + st a2,[a6+12] + inc 16,a6 + + ld [sp],%o7 + retl + inc 4,sp + +build_node_5_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_5 + st d1,[a6] + + deccc 8,d7 + bgeu,a build_node_ + mov 1,d0 + ba,a build_node_6_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_5: + ld [a1],d1 + ba yet_args_needed_ + mov 8,d0 + +build_node_6_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 1,d0 + + deccc 9,d7 + bgeu,a build_node_ + mov 2,d0 + ba,a build_node_7_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_6: + ld [a1],d1 + ba yet_args_needed_ + mov 9,d0 + +build_node_7_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 2,d0 + + deccc 10,d7 + bgeu,a build_node_ + mov 3,d0 + ba,a build_node_8_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_7: + ld [a1],d1 + ba yet_args_needed_ + mov 10,d0 + +build_node_8_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 3,d0 + + deccc 11,d7 + bgeu,a build_node_ + mov 4,d0 + ba,a build_node_9_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_8: + ld [a1],d1 + ba yet_args_needed_ + mov 11,d0 + +build_node_9_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 4,d0 + + deccc 12,d7 + bgeu,a build_node_ + mov 5,d0 + ba,a build_node_10_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_9: + ld [a1],d1 + ba yet_args_needed_ + mov 12,d0 + +build_node_10_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 5,d0 + + deccc 13,d7 + bgeu,a build_node_ + mov 6,d0 + ba,a build_node_11_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_10: + ld [a1],d1 + ba yet_args_needed_ + mov 13,d0 + +build_node_11_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 6,d0 + + deccc 14,d7 + bgeu,a build_node_ + mov 7,d0 + ba,a build_node_12_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_11: + ld [a1],d1 + ba yet_args_needed_ + mov 14,d0 + +build_node_12_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 7,d0 + + deccc 15,d7 + bgeu,a build_node_ + mov 8,d0 + ba,a build_node_13_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_12: + ld [a1],d1 + ba yet_args_needed_ + mov 15,d0 + +build_node_13_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 8,d0 + + deccc 16,d7 + bgeu,a build_node_ + mov 9,d0 + ba,a build_node_14_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_13: + ld [a1],d1 + ba yet_args_needed_ + mov 16,d0 + +build_node_14_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 9,d0 + + deccc 17,d7 + bgeu,a build_node_ + mov 10,d0 + ba,a build_node_15_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_14: + ld [a1],d1 + ba yet_args_needed_ + mov 17,d0 + +build_node_15_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 10,d0 + + deccc 18,d7 + bgeu,a build_node_ + mov 11,d0 + ba,a build_node_16_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_15: + ld [a1],d1 + ba yet_args_needed_ + mov 18,d0 + +build_node_16_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 11,d0 + + deccc 19,d7 + bgeu,a build_node_ + mov 12,d0 + ba,a build_node_17_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_16: + ld [a1],d1 + ba yet_args_needed_ + mov 19,d0 + +build_node_17_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 12,d0 + + deccc 20,d7 + bgeu,a build_node_ + mov 13,d0 + ba,a build_node_18_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_17: + ld [a1],d1 + ba yet_args_needed_ + mov 20,d0 + +build_node_18_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 13,d0 + + deccc 21,d7 + bgeu,a build_node_ + mov 14,d0 + ba,a build_node_19_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_18: + ld [a1],d1 + ba yet_args_needed_ + mov 21,d0 + +build_node_19_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 14,d0 + + deccc 22,d7 + bgeu,a build_node_ + mov 15,d0 + ba,a build_node_20_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_19: + ld [a1],d1 + ba yet_args_needed_ + mov 22,d0 + +build_node_20_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 15,d0 + + deccc 23,d7 + bgeu,a build_node_ + mov 16,d0 + ba,a build_node_21_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_20: + ld [a1],d1 + ba yet_args_needed_ + mov 23,d0 + +build_node_21_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 16,d0 + + deccc 24,d7 + bgeu,a build_node_ + mov 17,d0 + ba,a build_node_22_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_21: + ld [a1],d1 + ba yet_args_needed_ + mov 24,d0 + +build_node_22_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 17,d0 + + deccc 25,d7 + bgeu,a build_node_ + mov 18,d0 + ba,a build_node_23_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_22: + ld [a1],d1 + ba yet_args_needed_ + mov 25,d0 + +build_node_23_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 18,d0 + + deccc 26,d7 + bgeu,a build_node_ + mov 19,d0 + ba,a build_node_24_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_23: + ld [a1],d1 + ba yet_args_needed_ + mov 26,d0 + +build_node_24_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 19,d0 + + deccc 27,d7 + bgeu,a build_node_ + mov 20,d0 + ba,a build_node_25_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_24: + ld [a1],d1 + ba yet_args_needed_ + mov 27,d0 + +build_node_25_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 20,d0 + + deccc 28,d7 + bgeu,a build_node_ + mov 21,d0 + ba,a build_node_26_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_25: + ld [a1],d1 + ba yet_args_needed_ + mov 28,d0 + +build_node_26_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 21,d0 + + deccc 29,d7 + bgeu,a build_node_ + mov 22,d0 + ba,a build_node_27_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_26: + ld [a1],d1 + ba yet_args_needed_ + mov 29,d0 + +build_node_27_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 22,d0 + + deccc 30,d7 + bgeu,a build_node_ + mov 23,d0 + ba,a build_node_28_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_27: + ld [a1],d1 + ba yet_args_needed_ + mov 30,d0 + +build_node_28_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 23,d0 + + deccc 31,d7 + bgeu,a build_node_ + mov 24,d0 + ba,a build_node_29_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_28: + ld [a1],d1 + ba yet_args_needed_ + mov 31,d0 + +build_node_29_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 24,d0 + + deccc 32,d7 + bgeu,a build_node_ + mov 25,d0 + ba,a build_node_30_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_29: + ld [a1],d1 + ba yet_args_needed_ + mov 32,d0 + +build_node_30_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 25,d0 + + deccc 33,d7 + bgeu,a build_node_ + mov 26,d0 + ba,a build_node_31_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_30: + ld [a1],d1 + ba yet_args_needed_ + mov 33,d0 + +build_node_31_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 26,d0 + + deccc 34,d7 + bgeu,a build_node_ + mov 27,d0 + ba,a build_node_32_gc +#ifdef PROFILE + nop + nop + nop + nop +#endif + +yet_args_needed_31: + ld [a1],d1 + ba yet_args_needed_ + mov 34,d0 + +build_node_32_gc: + dec 4,sp + call collect_3 + st %o7,[sp] + ba build_node_ + mov 27,d0 + +yet_args_needed: + ld [a1],d1 + lduh [d1-2],d0 + inc 3,d0 + +yet_args_needed_: + subcc d7,d0,d7 + bltu yet_args_needed_gc + nop + +yet_args_needed_gc_r: + ld [a1+4],d3 + dec 1+4+3,d0 + ld [a1+8],a1 + mov a6,d2 + ld [a1],%o0 + ld [a1+4],%o1 + st %o0,[a6] + ld [a1+8],%o2 + st %o1,[a6+4] + inc 12,a1 + st %o2,[a6+8] + inc 12,a6 + +yet_args_needed_cp_a: + ld [a1],%o0 + inc 4,a1 + st %o0,[a6] + deccc 1,d0 + bge yet_args_needed_cp_a + inc 4,a6 + + st a0,[a6] + inc 8,d1 + st d1,[a6+4] + add a6,4,a0 + st d3,[a6+8] + st d2,[a6+12] + inc 16,a6 + + ld [sp],%o7 + retl + inc 4,sp + +yet_args_needed_gc: + dec 4,sp + call collect_2 + st %o7,[sp] + ba,a yet_args_needed_gc_r + +build_node_: + st d1,[a6] + st a2,[a6+4] + st a1,[a6+12] + inc 12,a6 + st a6,[a6-4] + st a0,[a6+4] + sub a6,12,a0 + ld [a4-4],a2 + st a2,[a6+8] + ld [a4-8],a2 + dec 8,a4 + st a2,[a6+12] + inc 16,a6 + +build_node_cp_a: + ld [a4-4],a2 + dec 4,a4 + deccc 1,d0 + st a2,[a6] + bne build_node_cp_a + inc 4,a6 + + ld [sp],%o7 + retl + inc 4,sp + @@ -115,7 +115,7 @@ mark_record_3_ab: setmbit (%o4,d0,d1,%o0,%o1,%o2) cmp a1,a0 - bgu mark_hnf_1 + bgu rmarkr_hnf_1 nop cmp %o0,1 @@ -138,7 +138,7 @@ not_next_byte_2: ld [a1],%o0 add a0,4+2+1,d0 st %o0,[a0+4] - ba mark_hnf_1 + ba rmarkr_hnf_1 st d0,[a1] not_yet_linked_ab: @@ -146,7 +146,7 @@ not_yet_linked_ab: ld [a1],%o0 add a0,4+2+1,d0 st %o0,[a0+4] - ba mark_hnf_1 + ba rmarkr_hnf_1 st d0,[a1] mark_record_3_aab: @@ -172,7 +172,7 @@ mark_record_3_aab: st a0,[a1] mov a1,d3 mov 1,d5 - ba mark_node + ba rmarkr_node mov d2,a0 mark_record_2: @@ -180,14 +180,14 @@ mark_record_2: bgu,a mark_hnf_2 ld [a0],%o0 - be mark_hnf_1 + be rmarkr_hnf_1 nop ba mark_next_node dec 4,a0 mark_record_1: tst %g1 - bne mark_hnf_1 + bne rmarkr_hnf_1 nop ba mark_next_node dec 4,a0 @@ -249,7 +249,7 @@ mark_arguments: be,a mark_hnf_2 ld [a0],%o0 - bcs mark_hnf_1 + bcs rmarkr_hnf_1 nop mark_hnf_3: @@ -288,31 +288,31 @@ no_shared_argument_part: st a0,[a1] mov a1,%l3 clr %l5 - ba mark_node + ba rmarkr_node mov d2,a0 shared_argument_part: cmp a1,a0 - bgu mark_hnf_1 + bgu rmarkr_hnf_1 nop ld [a1],%o0 add a0,4+2+1,d0 st d0,[a1] - ba mark_hnf_1 + ba rmarkr_hnf_1 st %o0,[a0+4] mark_lazy_node_1: bne mark_selector_node_1 nop -mark_hnf_1: +rmarkr_hnf_1: ld [a0],d2 bset d5,d3 st d3,[a0] mov a0,d3 mov 2,d5 - ba mark_node + ba rmarkr_node mov d2,a0 mark_indirection_node: @@ -328,7 +328,7 @@ mark_indirection_node: bclr %g3,%g1 stb %g1,[%o4+d2] - ba mark_node + ba rmarkr_node ld [a0],a0 mark_selector_node_1: @@ -349,20 +349,20 @@ mark_selector_node_1: mov 128,%g3 srl %g3,%g2,%g3 btst %g3,%g1 - bne mark_hnf_1 + bne rmarkr_hnf_1 nop ld [a1],d2 btst 2,d2 - be mark_hnf_1 + be rmarkr_hnf_1 nop ldsh [d2-2],%g1 cmp %g1,2 - bleu small_tuple_or_record + bleu rmarkr_small_tuple_or_record nop -large_tuple_or_record: +rmarkr_large_tuple_or_record: ld [a1+8],d1 sub d1,d6,%o1 srl %o1,2,%o1 @@ -373,10 +373,45 @@ large_tuple_or_record: mov 128,%g3 srl %g3,%g2,%g3 btst %g3,%g1 - bne mark_hnf_1 + bne rmarkr_hnf_1 nop -small_tuple_or_record: +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + + sub a0,4,d2 + + set __indirection,%g1 + lduh [d0+4],d0 + + sub d2,d6,%o1 + srl %o1,2,%o1 + + st %g1,[a0-4] + + srl %o1,3,a0 + ldub [%o4+a0],%g1 + and %o1,7,%g2 + mov 128,%g3 + srl %g3,%g2,%g3 + bclr %g3,%g1 + + cmp d0,8 + bltu rmarkr_tuple_or_record_selector_node_2 + stb %g1,[%o4+a0] + + beq,a rmarkr_tuple_selector_node_2 + ld [d1],a0 + +rmarkr_tuple_or_record_selector_node_g2: + sub d1,12,a0 + ld [a0+d0],a0 + +rmarkr_tuple_selector_node_2: + ba rmarkr_node + st a0,[d2+4] +#else +rmarkr_small_tuple_or_record: sub a0,4,d2 sub d2,d6,%o1 srl %o1,2,%o1 @@ -399,8 +434,9 @@ small_tuple_or_record: set __indirection,%g1 st %g1,[d2] - ba mark_node + ba rmarkr_node st a0,[d2+4] +#endif mark_record_selector_node_1: beq mark_strict_record_selector_node_1 @@ -410,31 +446,77 @@ mark_record_selector_node_1: mov 128,%g3 srl %g3,%g2,%g3 btst %g3,%g1 - bne mark_hnf_1 + bne rmarkr_hnf_1 nop ld [a1],d2 btst 2,d2 - be mark_hnf_1 + be rmarkr_hnf_1 nop ldsh [d2-2],%g1 cmp %g1,258 - bleu small_tuple_or_record + bleu rmarkr_small_tuple_or_record + nop + +#ifdef NEW_DESCRIPTORS + ld [a1+8],d1 + + sub d1,d6,%o1 + srl %o1,2,%o1 + + srl %o1,3,d2 + ldub [%o4+d2],%g1 + and %o1,7,%g2 + mov 128,%g3 + srl %g3,%g2,%g3 + btst %g3,%g1 + bne rmarkr_hnf_1 nop - b,a large_tuple_or_record + +rmarkr_small_tuple_or_record: + ld [d0-8],d0 + + sub a0,4,d2 + + set __indirection,%g1 + lduh [d0+4],d0 + + sub d2,d6,%o1 + srl %o1,2,%o1 + + st %g1,[a0-4] + + srl %o1,3,a0 + ldub [%o4+a0],%g1 + and %o1,7,%g2 + mov 128,%g3 + srl %g3,%g2,%g3 + bclr %g3,%g1 + + cmp d0,8 + bgtu rmarkr_tuple_or_record_selector_node_g2 + stb %g1,[%o4+a0] + +rmarkr_tuple_or_record_selector_node_2: + ld [a1+d0],a0 + ba rmarkr_node + st a0,[d2+4] +#else + b,a rmarkr_large_tuple_or_record +#endif mark_strict_record_selector_node_1: and %o1,7,%g2 mov 128,%g3 srl %g3,%g2,%g3 btst %g3,%g1 - bne mark_hnf_1 + bne rmarkr_hnf_1 nop ld [a1],d2 btst 2,d2 - be mark_hnf_1 + be rmarkr_hnf_1 nop ldsh [d2-2],%g1 @@ -452,10 +534,40 @@ mark_strict_record_selector_node_1: mov 128,%g3 srl %g3,%g2,%g3 btst %g3,%g1 - bne mark_hnf_1 + bne rmarkr_hnf_1 nop select_from_small_record: +#ifdef NEW_DESCRIPTORS + ld [d0-8],%g1 + dec 4,a0 + lduh [%g1+4],d0 + cmp d0,8 + bleu,a rmarkr_strict_record_selector_node_2 + ld [a1+d0],d0 + + dec 12,d0 + ld [d1+d0],d0 +rmarkr_strict_record_selector_node_2: + st d0,[a0+4] + + lduh [%g1+6],d0 + tst d0 + beq rmarkr_strict_record_selector_node_5 + cmp d0,8 + bleu,a rmarkr_strict_record_selector_node_4 + ld [a1+d0],d0 + + mov d1,a1 + dec 12,d0 + ld [a1+d0],d0 +rmarkr_strict_record_selector_node_4: + st d0,[a0+8] +rmarkr_strict_record_selector_node_5: + ld [%g1-4],d0 + ba mark_next_node + st d0,[a0] +#else ld [d0-8],%g1 dec 4,a0 ld [%g1+4],%g1 @@ -465,6 +577,7 @@ select_from_small_record: st %o7,[sp] b,a mark_next_node +#endif mark_hnf_2: bset 2,%o0 @@ -477,7 +590,7 @@ mark_hnf_2: clr d5 mov d2,a0 -mark_node: +rmarkr_node: sub a0,d6,d0 #ifdef SHARE_CHAR_INT cmp d0,%l7 @@ -519,12 +632,12 @@ c_argument_part_cycle1: add %l3,4+1,d0 st %o0,[%l3+4] st d0,[a0] - ba mark_node + ba rmarkr_node andn d2,3,a0 no_reverse_1: st a0,[%l3+4] - ba mark_node + ba rmarkr_node andn d2,3,a0 mark_lazy_node: @@ -552,7 +665,7 @@ mark_closure_with_unboxed_arguments_: st %l3,[a0] mov a0,%l3 clr %l5 - ba mark_node + ba rmarkr_node mov d2,a0 mark_closure_with_unboxed_arguments: @@ -564,7 +677,7 @@ mark_closure_with_unboxed_arguments: bgt mark_closure_with_unboxed_arguments_ nop - beq mark_hnf_1 + beq rmarkr_hnf_1 nop b mark_next_node @@ -628,7 +741,7 @@ no_char_3: sub a0,%l6,d1 srl d1,2,d1 - sub d0,12+2,a0 + sub d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET,a0 srl d1,3,d0 ldub [%o4+d0],%g1 @@ -771,7 +884,7 @@ mark_lr_array: st d3,[a0] mov a0,d3 mov 0,d5 - ba mark_node + ba rmarkr_node mov d2,a0 mark_array_length_0_1: @@ -784,7 +897,7 @@ mark_array_length_0_1: st %o0,[a0+4] st %o1,[a0] st d1,[a0-4] - ba mark_hnf_1 + ba rmarkr_hnf_1 dec 4,a0 mark_parent: @@ -858,12 +971,12 @@ no_reverse_3: st %o0,[a1+4] add a1,4+2+1,d0 st d0,[a0] - ba mark_node + ba rmarkr_node andn d2,3,a0 no_reverse_4: st a0,[a1+4] - ba mark_node + ba rmarkr_node andn d2,3,a0 argument_part_cycle1: @@ -900,7 +1013,7 @@ mark_next_node_after_static: c_argument_part_cycle2: st a0,[%l3+4] - ba mark_node + ba rmarkr_node andn d2,3,a0 mark_parent_after_static: @@ -1,21 +1,7 @@ ldg (heap_p2,a6) - -#ifdef COPIED_VECTOR - ldg (@flags,%o0) - btst 64,%o0 - bne no_copied_vector4 - nop - ldg (heap_size_129,d7) - ba copied_vector4 sll d7,6,d7 -no_copied_vector4: -#endif - ldg (@heap_size,d7) - srl d7,1,d7 - -copied_vector4: add a6,d7,%o4 set INT+2,d3 @@ -139,25 +125,37 @@ copy_record_21: bgu,a copy_lp2+4 ld [a2],a1 +#if 1 + ba,a copy_node_arity1 +#else be copy_node_arity1 nop ba copy_lp1 inc 8,a2 +#endif copy_record_arguments_1: +#if 1 + ba copy_lp2 + mov 0,d5 +#else tst d5 bne copy_lp2 mov 0,d5 ba copy_lp1 inc 4,a2 +#endif copy_record_arguments_3: -#ifdef COPIED_VECTOR ld [a2+4],%o1 btst 1,%o1 bne record_node_without_arguments_part -#endif + lduh [d0-2+2],d1 +#if 1 + inc 2+1,d5 + dec 1,d1 +#else tst d1 be copy_record_arguments_3b inc 2+1,d5 @@ -165,6 +163,7 @@ copy_record_arguments_3: deccc 1,d1 be,a copy_record_arguments_3abb dec 1,d5 +#endif sll d5,2,d5 add a2,d5,%o1 @@ -184,6 +183,7 @@ copy_record_arguments_3_c: ba copy_lp1 inc copy_lp1-8-copy_record_arguments_3_c,%o7 +#if 0 copy_record_arguments_3abb: sll d5,2,d6 copy_record_arguments_3abb_c: @@ -198,8 +198,8 @@ copy_record_arguments_3b: sll d5,2,d5 ba copy_lp1 add a2,d5,a2 +#endif -#ifdef COPIED_VECTOR record_node_without_arguments_part: bclr 1,%o1 st %o1,[a2+4] @@ -213,7 +213,6 @@ record_node_without_arguments_part_c: inc 4,a2 ba copy_lp1 inc copy_lp1-8-record_node_without_arguments_part_c,%o7 -#endif not_in_hnf_1: ld [d0-4],d5 @@ -327,7 +326,7 @@ copy_array_21_a: bcc,a copy_lp2+4 ld [a2],a1 - b,a copy_lp1 + ba,a copy_lp1 ! ! Copy root nodes to the other semi-space @@ -446,7 +445,7 @@ update_indirection_list_2: bne update_indirection_list_2 nop - b,a continue_after_selector_2 + ba,a continue_after_selector_2 copy_selector_2: inccc 4,d2 @@ -468,13 +467,54 @@ copy_selector_2: bleu copy_selector_2_ nop +#ifndef NEW_DESCRIPTORS +copy_selector_2__: +#endif +#if 1 + ld [a0+8],d1 + ld [d1],%g1 +#else ld [a0+8],%g1 ld [%g1],%g1 +#endif + btst 1,%g1 bne copy_arity_1_node2_ nop +#ifdef NEW_DESCRIPTORS + lduh [d2+4],d2 + set __indirection,%g1 + st %g1,[a1] + + cmp d2,8 + blu,a copy_selector_2_1 + ld [a0+4],a0 + beq,a copy_selector_2_2 + ld [d1],a0 + + sub d1,12,d1 + ld [d1+d2],a0 +copy_selector_2_1: +copy_selector_2_2: + st a0,[a1+4] + ld [a0],d0 + ba continue_after_selector_2 + mov a0,a1 + copy_selector_2_: + lduh [d2+4],d2 + set __indirection,%g1 + st %g1,[a1] + + ld [a0+d2],a0 + st a0,[a1+4] + ld [a0],d0 + ba continue_after_selector_2 + mov a0,a1 +#else +copy_selector_2_: +#endif ld [d2+4],%g1 mov a1,d2 @@ -505,10 +545,27 @@ copy_record_selector_2: ldsh [d1-2],%g1 cmp %g1,258 +#ifdef NEW_DESCRIPTORS + bleu copy_record_selector_2_ +#else bleu copy_selector_2_ +#endif nop -#ifdef COPIED_VECTOR +#if 1 + lduh [d1-2+2],%g1 + cmp %g1,2 + bgeu copy_selector_2__ + nop + + ld [a0+8],d1 + ldg (heap_p1,%o1) + ldg (heap_copied_vector,%g1) + sub d1,%o1,%o3 + srl %o3,2+1,%o3 + + tst_bit (%g1,%o3,%o2,%o0,%o1) +#else ld [a0+8],%o3 ldg (heap_p1,%o1) ldg (heap_copied_vector,%g1) @@ -516,10 +573,46 @@ copy_record_selector_2: srl %o3,2+1,%o3 tstmbit (%g1,%o3,d1,%o0,%o1,%o2) +#endif + +#ifdef NEW_DESCRIPTORS +# if 1 + beq copy_record_selector_2_ + nop + ba,a copy_arity_1_node2_ + +copy_selector_2__: + ld [a0+8],d1 + ld [d1],%g1 + btst 1,%g1 + bne copy_arity_1_node2_ + nop +# else + bne copy_arity_1_node2_ + nop +# endif +copy_record_selector_2_: + lduh [d2+4],d2 + set __indirection,%g1 + st %g1,[a1] + + cmp d2,8 + bleu,a copy_record_selector_3 + ld [a0+d2],a0 + + sub d2,12,d2 + ld [d1+d2],a0 +copy_record_selector_3: + st a0,[a1+4] + ld [a0],d0 + ba continue_after_selector_2 + mov a0,a1 +#else bne copy_arity_1_node2_ nop + + ba,a copy_selector_2_ #endif - b,a copy_selector_2_ copy_strict_record_selector_2: ld [a1+4],a0 @@ -533,7 +626,31 @@ copy_strict_record_selector_2: bleu copy_strict_record_selector_2_ nop -#ifdef COPIED_VECTOR +#if 1 + lduh [d1-2+2],%g1 + cmp %g1,2 + bltu copy_strict_record_selector_2_b + nop + + ld [a0+8],d1 + ld [d1],%g1 + btst 1,%g1 + bne copy_arity_1_node2_ + nop + ba,a copy_strict_record_selector_2_ + +copy_strict_record_selector_2_b: +#endif + +#if 1 + ld [a0+8],d1 + ldg (heap_p1,%o1) + ldg (heap_copied_vector,%g1) + sub d1,%o1,%o3 + srl %o3,2+1,%o3 + + tst_bit (%g1,%o3,%o2,%o0,%o1) +#else ld [a0+8],%o3 ldg (heap_p1,%o1) ldg (heap_copied_vector,%g1) @@ -541,11 +658,40 @@ copy_strict_record_selector_2: srl %o3,2+1,%o3 tstmbit (%g1,%o3,d1,%o0,%o1,%o2) +#endif bne copy_arity_1_node2_ nop -#endif copy_strict_record_selector_2_: +#ifdef NEW_DESCRIPTORS + lduh [d2+4],d0 + cmp d0,8 + bleu,a copy_strict_record_selector_3 + ld [a0+d0],d0 + + sub d0,12,d0 + ld [d1+d0],d0 +copy_strict_record_selector_3: +copy_strict_record_selector_4: + st d0,[a1+4] + + lduh [d2+6],d0 + cmp d0,0 + beq copy_strict_record_selector_6 + cmp d0,8 + bleu,a copy_strict_record_selector_5 + ld [a0+d0],d0 + + sub d0,12,d0 + ld [d1+d0],d0 +copy_strict_record_selector_5: + st d0,[a1+8] + + ld [d2-4],d0 + ba in_hnf_2 + st d0,[a1] +copy_strict_record_selector_6: +#else ld [d2+4],%g1 mov a1,d0 @@ -563,6 +709,7 @@ copy_strict_record_selector_2_: mov a0,a1 ba in_hnf_2 ld [a1],d0 +#endif copy_arity_0_node2_: st d0,[%o4-12] @@ -733,16 +880,9 @@ no_small_int_or_char_2: nop copy_normal_hnf_0_2: -#ifdef SHARE_CHAR_INT - sub d0,12+2,a0 + sub d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET,a0 st a0,[%i2] -#else - st d0,[%o4-4] - dec 4,%o4 - st %o4,[%i2] - or %o4,1,d2 - st d2,[a1] -#endif + deccc %l5 bpos copy_lp2 inc 4,%i2 @@ -911,10 +1051,13 @@ copy_bool_array_2: copy_record_2: deccc 258-2,d2 - bgu,a copy_record_node2_3 + bgu copy_record_node2_3 lduh [d0-2+2],%o0 bcs copy_record_node2_1 + cmp %o0,0 + + beq copy_real_or_file_2 nop st a6,[a2] @@ -935,13 +1078,15 @@ copy_record_2: nop copy_record_node2_1: + beq copy_record_node2_1_b + ld [a1+4],%o0 + st a6,[a2] st d0,[a6] add a6,1,a0 st a0,[a1] - ld [a1+4],%o1 inc 4,a2 - st %o1,[a6+4] + st %o0,[a6+4] deccc d5 bge copy_lp2 @@ -950,21 +1095,40 @@ copy_record_node2_1: retl nop -copy_record_node2_3: - tst %o0 - beq copy_strict_record_node2_3 +copy_record_node2_1_b: + st d0,[%o4-8] + add %o4,1-8,d2 + st d2,[a1] + inc 4,a2 + st %o0,[%o4-4] + dec 8,%o4 + + deccc d5 + bge copy_lp2 + st %o4,[a2-4] + + retl nop +copy_record_node2_3: + cmp %o0,1 + bleu copy_record_node2_3_ab_or_b + ld [a1+4],%o1 + st a6,[a2] st d0,[a6] add a6,1,d1 st d1,[a1] - ld [a1+4],%o1 inc 4,a2 st %o1,[a6+4] ld [a1+8],a0 -#ifdef COPIED_VECTOR +#if 1 + ld [a0],%o1 + btst 1,%o1 + bne record_arguments_already_copied_2 + nop +#else ldg (heap_copied_vector,a1) ldg (heap_p1,%o1) sub a0,%o1,d0 @@ -977,7 +1141,9 @@ copy_record_node2_3: #endif add a6,12,a1 st a1,[a6+8] +#if 0 ld [a0],%o1 +#endif inc 1,a1 st a1,[a0] inc 4,a0 @@ -1000,47 +1166,82 @@ cp_record_arg_lp2: retl nop -copy_strict_record_node2_3: +copy_record_node2_3_ab_or_b: + bltu copy_record_node2_3_b + nop + +copy_record_node2_3_ab: + st a6,[a2] + st d0,[a6] + add a6,1,d1 + st d1,[a1] + inc 4,a2 + st %o1,[a6+4] + ld [a1+8],a0 + + ldg (heap_copied_vector,a1) + ldg (heap_p1,%o1) + sub a0,%o1,d0 + srl d0,2+1,d0 + tstmbit (a1,d0,d1,%o0,%o1,%o2) + bne record_arguments_already_copied_2 + bset %o0,%o1 + + stb %o1,[a1+d1] + + inc d2 + sll d2,2,d2 + sub %o4,d2,a1 + + st a1,[a6+8] + ba cp_record_arg_lp3_c + inc 12,a6 + +copy_record_node2_3_b: dec 12,%o4 st %o4,[a2] st d0,[%o4] add %o4,1,d1 st d1,[a1] - ld [a1+4],%o1 inc 4,a2 st %o1,[%o4+4] ld [a1+8],a0 -#ifdef COPIED_VECTOR ldg (heap_copied_vector,a1) ldg (heap_p1,%o1) sub a0,%o1,d0 srl d0,2+1,d0 tstmbit (a1,d0,d1,%o0,%o1,%o2) - bne strict_record_arguments_already_copied_2 + bne record_arguments_already_copied_3 bset %o0,%o1 stb %o1,[a1+d1] -#endif + inc d2 sll d2,2,d2 sub %o4,d2,a1 + st a1,[%o4+8] + +cp_record_arg_lp3_c: + ld [a0],%o1 add a1,1,%o0 st %o0,[a0] + inc 4,a0 st %o1,[a1] mov a1,%o4 dec 8,d2 + ld [a0],%o1 -cp_strict_record_arg_lp2: +cp_record_arg_lp3: inc 4,a0 st %o1,[a1+4] inc 4,a1 deccc 4,d2 - bcc,a cp_strict_record_arg_lp2 + bcc,a cp_record_arg_lp3 ld [a0],%o1 deccc d5 @@ -1050,9 +1251,7 @@ cp_strict_record_arg_lp2: retl nop - -#ifdef COPIED_VECTOR -strict_record_arguments_already_copied_2: +record_arguments_already_copied_3: ld [a0],%o0 dec 1,%o0 @@ -1063,7 +1262,6 @@ strict_record_arguments_already_copied_2: retl nop - record_arguments_already_copied_2: ld [a0],%o0 inc 12,a6 @@ -1074,7 +1272,6 @@ record_arguments_already_copied_2: retl nop -#endif end_copy1: @@ -1092,7 +1289,7 @@ determine_free_finalizers_after_copy: ld [a2+4],a2 dec d0 st d0,[a0] - b determine_free_finalizers_after_copy + ba determine_free_finalizers_after_copy add d0,4,a0 finalizer_not_used_after_copy: @@ -1103,7 +1300,7 @@ finalizer_not_used_after_copy: st a2,[a1] add a2,4,a1 - b determine_free_finalizers_after_copy + ba determine_free_finalizers_after_copy ld [a2+4],a2 end_finalizers_after_copy: @@ -389,10 +389,8 @@ _mark_record_2_c: _mark_node: sub a0,d6,d1 -# ifdef SHARE_CHAR_INT cmp d1,d7 bcc _mark_next_node -# endif srl d1,2,d1 srl d1,3,%o0 @@ -559,19 +557,54 @@ _mark_selector_node_1: _large_tuple_or_record: ld [a1+8],d1 - sub d1,d6,d1 - srl d1,5,%o0 - srl d1,2,d1 + sub d1,d6,%o0 + srl %o0,5,%g1 + srl %o0,2,%o0 - andn %o0,3,%o0 - ld [%o4+%o0],%g1 - srl %g3,d1,%o3 + andn %g1,3,%g1 + ld [%o4+%g1],%g1 + srl %g3,%o0,%o3 btst %o3,%g1 bne,a _mark_node mov a1,a0 +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + set __indirection,%g1 + st %g1,[a0-4] + sub a0,4,d2 + lduh [d0+4],d0 + cmp d0,8 + bltu,a _mark_tuple_selector_node_1 + ld [a1+d0],a0 + + beq _mark_tuple_selector_node_2 + mov d1,a1 + + sub d0,12,d0 + ld [a1+d0],a0 + ba _mark_node + st a0,[d2+4] + +_mark_tuple_selector_node_2: + ld [a1],a0 + ba _mark_node + st a0,[d2+4] +#endif + _small_tuple_or_record: +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + set __indirection,%g1 + st %g1,[a0-4] + sub a0,4,d2 + lduh [d0+4],d0 + ld [a1+d0],a0 +_mark_tuple_selector_node_1: + ba _mark_node + st a0,[d2+4] +#else sub a0,4,d2 ld [d0-8],%g1 @@ -586,6 +619,7 @@ _small_tuple_or_record: st %g1,[d2] ba _mark_node st a0,[d2+4] +#endif _mark_record_selector_node_1: beq _mark_strict_record_selector_node_1 @@ -607,8 +641,40 @@ _mark_record_selector_node_1: cmp %g1,258 bleu _small_tuple_or_record nop + +#ifdef NEW_DESCRIPTORS + ld [a1+8],d1 + + sub d1,d6,%o0 + srl %o0,5,%g1 + srl %o0,2,%o0 + + andn %g1,3,%g1 + ld [%o4+%g1],%g1 + srl %g3,%o0,%o3 + + btst %o3,%g1 + bne,a _mark_node + mov a1,a0 + + ld [d0-8],d0 + set __indirection,%g1 + st %g1,[a0-4] + mov a0,d2 + lduh [d0+4],d0 + cmp d0,8 + bleu _mark_record_selector_node_2 + nop + mov d1,a1 + sub d0,12,d0 +_mark_record_selector_node_2: + ld [a1+d0],a0 + ba _mark_node + st a0,[d2] +#else b,a _large_tuple_or_record +#endif _mark_strict_record_selector_node_1: ld [%o4+%o0],%o1 @@ -642,6 +708,37 @@ _mark_strict_record_selector_node_1: mov a1,a0 _select_from_small_record: +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + dec 4,a0 + lduh [d0+4],%g1 + cmp %g1,8 + bleu,a _mark_strict_record_selector_node_2 + ld [a1+%g1],%g1 + + dec 12,%g1 + ld [d1+%g1],%g1 + +_mark_strict_record_selector_node_2: + st %g1,[a0+4] + + lduh [d0+6],%g1 + tst %g1 + beq _mark_strict_record_selector_node_5 + ld [d0-4],d0 + + cmp %g1,8 + bleu,a _mark_strict_record_selector_node_4 + ld [a1+%g1],%g1 + + dec 12,%g1 + ld [d1+%g1],%g1 +_mark_strict_record_selector_node_4: + st %g1,[a0+8] +_mark_strict_record_selector_node_5: + ba _mark_next_node + st d0,[a0] +#else ld [d0-8],%g1 dec 4,a0 ld [%g1+4],%g1 @@ -651,6 +748,7 @@ _select_from_small_record: st %o7,[sp] b,a _mark_next_node +#endif _mark_indirection_node: ba _mark_node @@ -1334,8 +1432,8 @@ __mark__selector__node__1: nop __large__tuple__or__record: - ld [a1+8],%o2 - sub %o2,d6,%o2 + ld [a1+8],d1 + sub d1,d6,%o2 srl %o2,5,d2 srl %o2,2,%o2 andn d2,3,d2 @@ -1346,7 +1444,43 @@ __large__tuple__or__record: bne __mark__selector__1 nop +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + set __indirection,%g1 + st %g1,[a0-4] + + mov a0,d2 + lduh [d0+4],d0 + cmp d0,8 + bltu,a __mark_tuple_selector_node_1 + ld [a1+d0],a0 + + beq __mark_tuple_selector_node_2 + mov d1,a1 + + dec 12,d0 + ld [a1+d0],a0 + ba __mark__node + st a0,[d2] + +__mark_tuple_selector_node_2: + ld [a1],a0 + ba __mark__node + st a0,[d2] +#endif + __small__tuple__or__record: +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + set __indirection,%g1 + st %g1,[a0-4] + mov a0,d2 + lduh [d0+4],d0 + ld [a1+d0],a0 +__mark_tuple_selector_node_1: + ba __mark__node + st a0,[d2] +#else sub a0,4,d2 ld [d0-8],%g1 @@ -1361,6 +1495,7 @@ __small__tuple__or__record: st %g1,[d2] ba __mark__node st a0,[d2+4] +#endif __mark__record__selector__node__1: beq __mark__strict__record__selector__node__1 @@ -1375,9 +1510,44 @@ __mark__record__selector__node__1: ldsh [d2-2],%g1 cmp %g1,258 +#ifdef NEW_DESCRIPTORS + bleu __small__record + nop + + ld [a1+8],d1 + + sub d1,d6,%o0 + srl %o0,5,%g1 + srl %o0,2,%o0 + + andn %g1,3,%g1 + ld [%o4+%g1],%g1 + srl %g3,%o0,%o3 + + btst %o3,%g1 + bne __mark__selector__1 + nop + +__small__record: + ld [d0-8],d0 + set __indirection,%g1 + st %g1,[a0-4] + lduh [d0+4],d0 + cmp d0,8 + bleu __mark_record_selector_node_2 + mov a0,d2 + + mov d1,a1 + dec 12,d0 +__mark_record_selector_node_2: + ld [a1+d0],a0 + ba __mark__node + st a0,[d2] +#else bleu __small__tuple__or__record nop b,a __large__tuple__or__record +#endif __mark__strict__record__selector__node__1: bne __mark__selector__1 @@ -1406,6 +1576,37 @@ __mark__strict__record__selector__node__1: nop __select__from__small__record: +#ifdef NEW_DESCRIPTORS + ld [d0-8],d0 + dec 4,a0 + lduh [d0+4],%g1 + cmp %g1,8 + bleu,a __mark_strict_record_selector_node_2 + ld [a1+%g1],%g1 + + dec 12,%g1 + ld [d1+%g1],%g1 +__mark_strict_record_selector_node_2: + st %g1,[a0+4] + + lduh [d0+6],%g1 + tst %g1 + beq __mark_strict_record_selector_node_5 + ld [d0-4],d0 + + cmp %g1,8 + bleu,a __mark_strict_record_selector_node_4 + ld [a1+%g1],%g1 + + mov d1,a1 + dec 12,%g1 + ld [a1+%g1],%g1 +__mark_strict_record_selector_node_4: + st %g1,[a0+8] +__mark_strict_record_selector_node_5: + ba __mark__node + st d0,[a0] +#else ld [d0-8],%g1 dec 4,a0 ld [%g1+4],%g1 @@ -1415,6 +1616,7 @@ __select__from__small__record: st %o7,[sp] b,a __mark__node +#endif __mark__indirection__node: ba __mark__node @@ -1608,7 +1810,7 @@ __no__char__3: nop ba __mark__next__node__after__static - sub d0,12+2,a0 + sub d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET,a0 __mark__real__file__or__string: set __STRING__+2,%g1 @@ -12,6 +12,13 @@ #undef COUNT_GARBAGE_COLLECTIONS #define SP_G5 #define MARK_GC +#define NEW_DESCRIPTORS + +#ifdef NEW_DESCRIPTORS +# define ZERO_ARITY_DESCRIPTOR_OFFSET (-4) +#else +# define ZERO_ARITY_DESCRIPTOR_OFFSET (-12) +#endif #define ldg(g,r) sethi %hi g,%o0 ; ld [%o0+%lo g],r #define ldgr(g,r,ir) sethi %hi g,ir ; ld [ir+%lo g],r @@ -40,6 +47,14 @@ srl bit,scratch,bit ;\ btst bit,byte +#define tst_bit(vector,bit_n,byte_offset,bit,byte) \ + mov 128,bit ;\ + srl bit_n,3,byte_offset ;\ + ldub [vector+byte_offset],byte ;\ + and bit_n,7,bit_n ;\ + srl bit,bit_n,bit ;\ + btst bit,byte + #define clrmbit(vector,bit_n,byte_offset,bit,byte,scratch) \ mov 128,bit ;\ srl bit_n,3,byte_offset ;\ @@ -837,11 +852,27 @@ DtoAC: btst 2,d0 bne DtoAC_ nop - ba DtoAC_string_a2 - mov d0,a2 + add d0,4,a0 + ba build_string + ld [d0],d0 -DtoAC_: add d0,-2,a2 - ldsh [a2],d1 +DtoAC_: + ldsh [d0-2],d1 +#ifdef NEW_DESCRIPTORS + cmp d1,256 + bgeu,a DtoAC_string_a0 + ld [d0-6],a0 + + lduh [d0],d1 + add d0,10,a0 + add a0,d1,a0 + +DtoAC_string_a0: + ld [a0],d0 + ba build_string + inc 4,a0 +#else + add d0,-2,a2 cmp d1,256 bgeu DtoAC_record sll d1,3,d1 @@ -854,6 +885,7 @@ DtoAC_string_a2: ld [a2],d0 ba build_string add a2,4,a0 +#endif print_symbol: ba print_symbol_2 @@ -885,8 +917,19 @@ print_symbol_2: bne end_print_symbol nop -printD_: add d0,-2,a2 - ldsh [a2],d1 +printD_: + ldsh [d0-2],d1 +#ifdef NEW_DESCRIPTORS + cmp d1,256 + bgeu,a print_string_a2 + ld [d0-6],a2 + + lduh [d0],d1 + add d0,10,a2 + ba print_string_a2 + add a2,d1,a2 +#else + add d0,-2,a2 cmp d1,256 bgeu print_record sll d1,3,d1 @@ -894,6 +937,7 @@ printD_: add d0,-2,a2 print_record: ba print_string_a2 ld [a2-4],a2 +#endif end_print_symbol: ld [sp],%o7 @@ -1235,9 +1279,9 @@ D_to_S_x: #ifdef MY_ITOS sprintf_buffer_to_string: set sprintf_buffer,a0 +#endif ! d0 : length, a0 : string build_string: -#endif add d0,3,d1 srl d1,2,d1 dec 2,d7 @@ -3535,10 +3579,10 @@ ea_ap: ld [%i4-4],a0 dec 4,%i4 ap_1: - ld [a1],%i2 - ld [%i2+4-2],%i2 + ld [a1],a2 + ld [a2+4-2],a2 dec 4,sp - call %i2 + call a2 st %o7,[sp] ld [%i4-4],%i2 @@ -3557,9 +3601,9 @@ ap_1: #endif e__system__sAP: - ld [a1],%i2 - ld [%i2+4-2],%i2 - jmp %i2 + ld [a1],a2 + ld [a2+4-2],a2 + jmp a2 nop _create_arrayB: @@ -3818,6 +3862,7 @@ _st_fillr5_array: jmp a1+8 nop +#ifndef NEW_DESCRIPTORS yet_args_needed: ! for more than 4 arguments ld [a1],d1 @@ -3989,6 +4034,7 @@ gc_24: dec 4,sp st %o7,[sp] ba gc_r_24 nop +#endif repl_args_b: tst d0 @@ -4165,3 +4211,7 @@ ea__S_P2_3: retl inc 4,sp #endif + +#ifdef NEW_DESCRIPTORS +# include "sap.s" +#endif |