summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sap.s2643
-rw-r--r--scompact.s189
-rw-r--r--scopy.s307
-rw-r--r--smark.s224
-rw-r--r--sstartup.s76
5 files changed, 3322 insertions, 117 deletions
diff --git a/sap.s b/sap.s
new file mode 100644
index 0000000..8b4edb7
--- /dev/null
+++ b/sap.s
@@ -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
+
diff --git a/scompact.s b/scompact.s
index 773a8a2..e9862f7 100644
--- a/scompact.s
+++ b/scompact.s
@@ -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:
diff --git a/scopy.s b/scopy.s
index 21a21bd..bb9ca5c 100644
--- a/scopy.s
+++ b/scopy.s
@@ -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:
diff --git a/smark.s b/smark.s
index 2859e8f..6e8a253 100644
--- a/smark.s
+++ b/smark.s
@@ -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
diff --git a/sstartup.s b/sstartup.s
index afbb1c6..053ac06 100644
--- a/sstartup.s
+++ b/sstartup.s
@@ -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