diff options
-rw-r--r-- | iap.s | 953 | ||||
-rw-r--r-- | istartup.s | 4 |
2 files changed, 945 insertions, 12 deletions
@@ -65,6 +65,34 @@ .globl add_empty_node_31 .globl add_empty_node_32 + .globl yet_args_needed_5 + .globl yet_args_needed_6 + .globl yet_args_needed_7 + .globl yet_args_needed_8 + .globl yet_args_needed_9 + .globl yet_args_needed_10 + .globl yet_args_needed_11 + .globl yet_args_needed_12 + .globl yet_args_needed_13 + .globl yet_args_needed_14 + .globl yet_args_needed_15 + .globl yet_args_needed_16 + .globl yet_args_needed_17 + .globl yet_args_needed_18 + .globl yet_args_needed_19 + .globl yet_args_needed_20 + .globl yet_args_needed_21 + .globl yet_args_needed_22 + .globl yet_args_needed_23 + .globl yet_args_needed_24 + .globl yet_args_needed_25 + .globl yet_args_needed_26 + .globl yet_args_needed_27 + .globl yet_args_needed_28 + .globl yet_args_needed_29 + .globl yet_args_needed_30 + .globl yet_args_needed_31 + ap_32: movl (a1),a2 movl $32*8,d1 @@ -282,12 +310,13 @@ ap_2: jne no_fast_ap2 fast_ap: + addl a2,d1 movzwl -2(a2),d0 - movl -6(a2,d1),d1 + movl -6(d1),a2 #ifdef PROFILE - subl $20,d1 + subl $20,a2 #else - subl $12,d1 + subl $12,a2 #endif cmpl $1,d0 jb repl_args_0 @@ -310,14 +339,18 @@ fast_ap: cmpl $7,d0 jb repl_args_6 + push d1 + repl_args_7_: - movl -8(a0,d0,4),a2 - movl a2,(a3) + movl -8(a0,d0,4),d1 + movl d1,(a3) subl $1,d0 addl $4,a3 cmpl $6,d0 jne repl_args_7_ + pop d1 + repl_args_6: movl 16(a0),d0 movl d0,(a3) @@ -329,28 +362,28 @@ repl_args_6: movl (a0),a0 movl d0,12(a3) addl $16,a3 - jmp *d1 + jmp *a2 repl_args_0: movl a0,a1 movl -4(a3),a0 subl $4,a3 - jmp *d1 + jmp *a2 repl_args_1: movl 4(a1),a1 - jmp *d1 + jmp *a2 repl_args_2: movl 4(a1),a1 - jmp *d1 + jmp *a2 repl_args_3: movl 4(a0),d0 movl (a0),a0 movl d0,(a3) addl $4,a3 - jmp *d1 + jmp *a2 repl_args_4: movl 8(a0),d0 @@ -359,7 +392,7 @@ repl_args_4: movl (a0),a0 movl d0,4(a3) addl $8,a3 - jmp *d1 + jmp *a2 repl_args_5: movl 12(a0),d0 @@ -370,7 +403,7 @@ repl_args_5: movl (a0),a0 movl d0,8(a3) addl $12,a3 - jmp *d1 + jmp *a2 no_fast_ap32: call *2(a2) @@ -927,3 +960,899 @@ add_empty_node_14_lp: add_empty_node_14_gc: call collect_2 jmp add_empty_node_14_gc_ + + +yet_args_needed_0: + cmpl end_heap,a4 + jae yet_args_needed_0_gc +yet_args_needed_0_gc_r: + mov a0,4(a4) + mov (a1),d0 + mov a4,a0 + add $8,d0 + mov d0,(a4) + add $8,a4 + ret + +yet_args_needed_0_gc: + call collect_2 + jmp yet_args_needed_0_gc_r + + + align (2) + cmpl end_heap,a4 + jmp build_node_2 + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_1: + cmpl end_heap,a4 + jae yet_args_needed_1_gc +yet_args_needed_1_gc_r: + mov a0,8(a4) + mov (a1),d0 + mov a4,a0 + add $8,d0 + mov d0,(a4) + mov 4(a1),d1 + mov d1,4(a4) + add $12,a4 + ret + +yet_args_needed_1_gc: + call collect_2 + jmp yet_args_needed_1_gc_r + +build_node_2: + jae build_node_2_gc +build_node_2_gc_r: + movl d1,(a4) + movl a1,4(a4) + movl a0,8(a4) + movl a4,a0 + addl $12,a4 + ret + +build_node_2_gc: + call collect_2 + jmp build_node_2_gc_r + + + align (2) + cmpl end_heap,a4 + jmp build_node_3 + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_2: + cmpl end_heap,a4 + jae gc_22 +gc_r_22: + mov (a1),d0 + mov a0,4(a4) + add $8,d0 + mov 4(a1),a2 + mov d0,8(a4) + lea 8(a4),a0 + mov a2,12(a4) + mov 8(a1),a2 + mov a2,(a4) + mov a4,16(a4) + add $20,a4 + ret + +gc_22: call collect_2 + jmp gc_r_22 + +build_node_3: + jae build_node_3_gc +build_node_3_gc_r: + movl d1,(a4) + lea 12(a4),a2 + movl a1,4(a4) + movl a2,8(a4) + movl a0,12(a4) + movl a4,a0 + movl -4(a3),a2 + subl $4,a3 + movl a2,16(a4) + addl $20,a4 + ret + +build_node_3_gc: + call collect_2 + jmp build_node_3_gc_r + + + align (2) + cmpl end_heap,a4 + jmp build_node_4 + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_3: + cmpl end_heap,a4 + jae gc_23 +gc_r_23: + mov (a1),d0 + mov a0,8(a4) + add $8,d0 + mov 4(a1),a2 + mov d0,12(a4) + mov 8(a1),a1 + mov a2,16(a4) + mov (a1),a2 + mov a4,20(a4) + mov a2,(a4) + mov 4(a1),a2 + lea 12(a4),a0 + mov a2,4(a4) + add $24,a4 + ret + +gc_23: call collect_2 + jmp gc_r_23 + +build_node_4: + jae build_node_4_gc +build_node_4_gc_r: + movl d1,(a4) + lea 12(a4),a2 + movl a1,4(a4) + movl a2,8(a4) + movl a0,12(a4) + movl a4,a0 + movl -4(a3),a2 + movl a2,16(a4) + movl -8(a3),a2 + subl $8,a3 + movl a2,20(a4) + addl $24,a4 + ret + +build_node_4_gc: + call collect_2 + jmp build_node_4_gc_r + + + align (2) + cmpl end_heap,a4 + jmp build_node_5 + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_4: + cmpl end_heap,a4 + jae gc_24 +gc_r_24: + mov (a1),d0 + mov a0,12(a4) + add $8,d0 + mov 4(a1),a2 + mov d0,16(a4) + mov 8(a1),a1 + mov a2,20(a4) + mov (a1),a2 + mov a4,24(a4) + mov a2,(a4) + mov 4(a1),a2 + lea 16(a4),a0 + mov a2,4(a4) + mov 8(a1),a2 + mov a2,8(a4) + add $28,a4 + ret + +gc_24: call collect_2 + jmp gc_r_24 + +build_node_5: + jae build_node_5_gc +build_node_5_gc_r: + movl d1,(a4) + lea 12(a4),a2 + movl a1,4(a4) + movl a2,8(a4) + movl a0,12(a4) + movl a4,a0 + movl -4(a3),a2 + movl a2,16(a4) + movl -8(a3),a2 + movl a2,20(a4) + movl -12(a3),a2 + subl $12,a3 + movl a2,24(a4) + addl $28,a4 + ret + +build_node_5_gc: + call collect_2 + jmp build_node_5_gc_r + + + align (2) + movl $6,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_5: + mov (a1),d1 + movl $8,d0 + jmp yet_args_needed_ + + + align (2) + movl $7,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_6: + mov (a1),d1 + movl $9,d0 + jmp yet_args_needed_ + + align (2) + movl $8,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_7: + mov (a1),d1 + movl $10,d0 + jmp yet_args_needed_ + + align (2) + movl $9,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_8: + mov (a1),d1 + movl $11,d0 + jmp yet_args_needed_ + + align (2) + movl $10,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_9: + mov (a1),d1 + movl $12,d0 + jmp yet_args_needed_ + + align (2) + movl $11,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_10: + mov (a1),d1 + movl $13,d0 + jmp yet_args_needed_ + + align (2) + movl $12,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_11: + mov (a1),d1 + movl $14,d0 + jmp yet_args_needed_ + + align (2) + movl $13,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_12: + mov (a1),d1 + movl $15,d0 + jmp yet_args_needed_ + + align (2) + movl $14,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_13: + mov (a1),d1 + movl $16,d0 + jmp yet_args_needed_ + + align (2) + movl $15,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_14: + mov (a1),d1 + movl $17,d0 + jmp yet_args_needed_ + + align (2) + movl $16,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_15: + mov (a1),d1 + movl $18,d0 + jmp yet_args_needed_ + + align (2) + movl $17,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_16: + mov (a1),d1 + movl $19,d0 + jmp yet_args_needed_ + + align (2) + movl $18,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_17: + mov (a1),d1 + movl $20,d0 + jmp yet_args_needed_ + + align (2) + movl $19,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_18: + mov (a1),d1 + movl $21,d0 + jmp yet_args_needed_ + + align (2) + movl $20,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_19: + mov (a1),d1 + movl $22,d0 + jmp yet_args_needed_ + + align (2) + movl $21,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_20: + mov (a1),d1 + movl $23,d0 + jmp yet_args_needed_ + + align (2) + movl $22,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_21: + mov (a1),d1 + movl $24,d0 + jmp yet_args_needed_ + + align (2) + movl $23,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_22: + mov (a1),d1 + movl $25,d0 + jmp yet_args_needed_ + + align (2) + movl $24,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_23: + mov (a1),d1 + movl $26,d0 + jmp yet_args_needed_ + + align (2) + movl $25,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_24: + mov (a1),d1 + movl $27,d0 + jmp yet_args_needed_ + + align (2) + movl $26,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_25: + mov (a1),d1 + movl $28,d0 + jmp yet_args_needed_ + + align (2) + movl $27,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_26: + mov (a1),d1 + movl $29,d0 + jmp yet_args_needed_ + + align (2) + movl $28,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_27: + mov (a1),d1 + movl $30,d0 + jmp yet_args_needed_ + + align (2) + movl $29,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_28: + mov (a1),d1 + movl $31,d0 + jmp yet_args_needed_ + + align (2) + movl $30,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_29: + mov (a1),d1 + movl $32,d0 + jmp yet_args_needed_ + + align (2) + movl $31,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_30: + mov (a1),d1 + movl $33,d0 + jmp yet_args_needed_ + + align (2) + movl $32,d0 + jmp build_node_ + nop + nop + align (2) +#ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop +#endif +yet_args_needed_31: + mov (a1),d1 + movl $34,d0 + jmp yet_args_needed_ + +yet_args_needed: +/ for more than 4 arguments + mov (a1),d1 + movzwl -2(d1),d0 + add $3,d0 +yet_args_needed_: + lea -32(a4,d0,4),a2 + cmpl end_heap,a2 + jae yet_args_needed_gc +yet_args_needed_gc_r: + sub $3+1+4,d0 + push d1 + push a0 + mov 4(a1),d1 + mov 8(a1),a1 + mov a4,a2 + mov (a1),a0 + mov a0,(a4) + mov 4(a1),a0 + mov a0,4(a4) + mov 8(a1),a0 + mov a0,8(a4) + add $12,a1 + add $12,a4 + +yet_args_needed_cp_a: + mov (a1),a0 + add $4,a1 + mov a0,(a4) + add $4,a4 + subl $1,d0 + jge yet_args_needed_cp_a + + pop a0 + mov a0,(a4) + pop d0 + add $8,d0 + mov d0,4(a4) + lea 4(a4),a0 + mov d1,8(a4) + mov a2,12(a4) + add $16,a4 + ret + +yet_args_needed_gc: + call collect_2l + jmp yet_args_needed_gc_r + +build_node_: + lea -32+8(a4,d0,4),a2 + cmpl end_heap,a2 + jae build_node_gc +build_node_gc_r: + movl d1,(a4) + lea 12(a4),a2 + movl a1,4(a4) + movl a2,8(a4) + movl a0,12(a4) + movl a4,a0 + movl -4(a3),a2 + movl a2,16(a4) + movl -8(a3),a2 + movl a2,20(a4) + movl -12(a3),a2 + subl $12,a3 + movl a2,24(a4) + addl $28,a4 + + subl $5,d0 +build_node_cp_a: + movl -4(a3),a2 + subl $4,a3 + movl a2,(a4) + addl $4,a4 + subl $1,d0 + jne build_node_cp_a + + ret + +build_node_gc: + call collect_2l + jmp build_node_gc_r @@ -4815,6 +4815,8 @@ st_fillr5_array: #endif +#ifndef NEW_DESCRIPTORS + yet_args_needed: / for more than 4 arguments mov (a1),d1 @@ -4958,6 +4960,8 @@ gc_r_24: gc_24: call collect_2 jmp gc_r_24 +#endif + repl_args_b: test d0,d0 jle repl_args_b_1 |