/ / File: istartup.s / Author: John van Groningen / Machine: Intel 386 #define K6_0 0 #define d0 %eax #define d1 %ebx #define a0 %ecx #define a1 %edx #define a2 %ebp #define a3 %esi #define a4 %edi #define sp %esp #define d0w %ax #define d1w %bx #define a0w %cx #define a1w %dx #define a2w %bp #define a3w %si #define a4w %di #define d0b %al #define d1b %bl #define a0b %cl #define a1b %dl #define d0lb %al #define d0hb %ah #define d1lb %bl #define d1hb %bh #define SHARE_CHAR_INT #define MY_ITOS #define FINALIZERS #define STACK_OVERFLOW_EXCEPTION_HANDLER #define WRITE_HEAP #undef MEASURE_GC #undef DEBUG #undef PREFETCH2 #define NO_BIT_INSTRUCTIONS #define ADJUST_HEAP_SIZE #define MARK_GC #define MARK_AND_COPY_GC #define NEW_DESCRIPTORS / #define PROFILE #define MODULE_NAMES_IN_TIME_PROFILER #undef COMPACT_GC_ONLY #define MINIMUM_HEAP_SIZE 8000 #define MINIMUM_HEAP_SIZE_2 4000 #if defined(_WINDOWS_) || defined (ELF) # define align(n) .align (1< a0: array _create_r_array: movl 4(sp),a1 pushl d0 shl $2,a1 lea 12-32(a4),a2 _sub_size_lp: addl a1,a2 subl $1,d0 jne _sub_size_lp popl d0 cmpl end_heap,a2 jb no_collect_4586 call collect_1l no_collect_4586: movl a0,a2 pop a0 pop a1 / a1: number of elements, a0: element descriptor / d0: element size, d1: element a size a2:a_element movl $__ARRAY__+2,(a4) movl a1,4(a4) movl a0,8(a4) movl a4,a0 addl $12,a4 / a1: number of elements, a0: array / d0: element size, d1: element a size a2:a_element test d1,d1 je _create_r_array_0 subl $2,d1 jc _create_r_array_1 je _create_r_array_2 subl $2,d1 jc _create_r_array_3 je _create_r_array_4 jmp _create_r_array_5 _create_r_array_0: shl $2,a1 jmp _st_fillr0_array _fillr0_array: addl a1,a4 _st_fillr0_array: subl $1,d0 jnc _fillr0_array ret _create_r_array_1: shl $2,d0 jmp _st_fillr1_array _fillr1_array: movl a2,(a4) addl d0,a4 _st_fillr1_array: subl $1,a1 jnc _fillr1_array ret _create_r_array_2: shl $2,d0 jmp _st_fillr2_array _fillr2_array: movl a2,(a4) movl a2,4(a4) addl d0,a4 _st_fillr2_array: subl $1,a1 jnc _fillr2_array ret _create_r_array_3: shl $2,d0 jmp _st_fillr3_array _fillr3_array: movl a2,(a4) movl a2,4(a4) movl a2,8(a4) addl d0,a4 _st_fillr3_array: subl $1,a1 jnc _fillr3_array ret _create_r_array_4: shl $2,d0 jmp _st_fillr4_array _fillr4_array: movl a2,(a4) movl a2,4(a4) movl a2,8(a4) movl a2,12(a4) addl d0,a4 _st_fillr4_array: subl $1,a1 jnc _fillr4_array ret _create_r_array_5: push a0 movl d1,a0 subl $4,d0 subl d1,d0 subl $1,a0 shl $2,d0 jmp _st_fillr5_array _fillr5_array: movl a2,(a4) movl a2,4(a4) movl a2,8(a4) movl a2,12(a4) addl $16,a4 movl a0,d1 _copy_elem_5_lp: movl a2,(a4) addl $4,a4 subl $1,d1 jnc _copy_elem_5_lp addl d0,a4 _st_fillr5_array: subl $1,a1 jnc _fillr5_array pop a0 ret create_arrayB: movl d1,a1 addl $3,d1 shr $2,d1 lea -32+12(a4,d1,4),a2 cmpl end_heap,a2 jb no_collect_4575 pushl a1 call collect_0l popl a1 no_collect_4575: movl d0,a2 shl $8,a2 orl a2,d0 movl d0,a2 shl $16,a2 orl a2,d0 movl a4,a0 movl $__ARRAY__+2,(a4) movl a1,4(a4) movl $BOOL+2,8(a4) addl $12,a4 jmp create_arrayBCI create_arrayC: movl d1,a1 addl $3,d1 shr $2,d1 lea -32+8(a4,d1,4),a2 cmpl end_heap,a2 jb no_collect_4578 pushl a1 call collect_0l popl a1 no_collect_4578: movl d0,a2 shl $8,a2 orl a2,d0 movl d0,a2 shl $16,a2 orl a2,d0 movl a4,a0 movl $__STRING__+2,(a4) movl a1,4(a4) addl $8,a4 jmp create_arrayBCI create_arrayI: lea -32+12(a4,d1,4),a2 cmpl end_heap,a2 jb no_collect_4577 call collect_0l no_collect_4577: movl a4,a0 movl $__ARRAY__+2,(a4) movl d1,4(a4) lea 0(,d1,4),a1 movl $INT+2,8(a4) addl $12,a4 create_arrayBCI: mov d1,a1 shr $1,d1 testb $1,a1b je st_filli_array movl d0,(a4) addl $4,a4 jmp st_filli_array filli_array: movl d0,(a4) movl d0,4(a4) addl $8,a4 st_filli_array: subl $1,d1 jnc filli_array ret create_arrayR: fstl -8(sp) lea -32+12+4(a4,d0,8),a2 movl -8(sp),d1 movl -4(sp),a1 cmpl end_heap,a2 jb no_collect_4579 pushl a1 call collect_0l popl a1 no_collect_4579: orl $4,a4 movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl $REAL+2,8(a4) addl $12,a4 jmp st_fillr_array fillr_array: movl d1,(a4) movl a1,4(a4) addl $8,a4 st_fillr_array: subl $1,d0 jnc fillr_array ret create_array: lea -32+12(a4,d0,4),a2 cmpl end_heap,a2 jb no_collect_4576 call collect_1l no_collect_4576: movl a0,d1 movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl $0,8(a4) addl $12,a4 #if 0 popl a2 #endif jmp fillr1_array #if 0 / in 4(sp): number of elements, (sp): element descriptor / d0: element size, d1: element a size -> a0: array create_r_array: subl $2,d0 jc create_r_array_1 je create_r_array_2 subl $2,d0 jc create_r_array_3 je create_r_array_4 jmp create_r_array_5 create_r_array_1: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size lea -32+12(a4,d0,4),a2 cmpl end_heap,a2 jb no_collect_4581 pushl a1 call collect_0l popl a1 no_collect_4581: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 popl a2 test d1,d1 je r_array_1_b movl -4(a3),d1 subl $4,a3 jmp fillr1_array r_array_1_b: popl d1 fillr1_array: movl d0,a1 shr $1,d0 testb $1,a1b je st_fillr1_array_1 movl d1,(a4) addl $4,a4 jmp st_fillr1_array_1 fillr1_array_lp: movl d1,(a4) movl d1,4(a4) addl $8,a4 st_fillr1_array_1: subl $1,d0 jnc fillr1_array_lp jmp *a2 create_r_array_2: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size lea -32+12(a4,d0,8),a2 cmpl end_heap,a2 jb no_collect_4582 pushl a1 call collect_0 popl a1 no_collect_4582: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 popl a1 subl $1,d1 jc r_array_2_bb je r_array_2_ab r_array_2_aa: movl -4(a3),d1 movl -8(a3),a2 subl $8,a3 jmp st_fillr2_array r_array_2_ab: movl -4(a3),d1 popl a2 subl $4,a3 jmp st_fillr2_array r_array_2_bb: popl d1 popl a2 jmp st_fillr2_array fillr2_array_1: movl d1,(a4) movl a2,4(a4) addl $8,a4 st_fillr2_array: subl $1,d0 jnc fillr2_array_1 jmp *a1 create_r_array_3: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size lea -32+12(a4,d0,8),a2 lea (a2,d0,4),a2 cmpl end_heap,a2 jb no_collect_4583 pushl a1 call collect_0l popl a1 no_collect_4583: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 popl a1 test d1,d1 je r_array_3 movl d1,a2 shl $2,a2 subl a2,a3 mov a3,a2 subl $1,d1 copy_a_to_b_lp3: pushl (a2) addl $4,a2 subl $1,d1 jnc copy_a_to_b_lp3 r_array_3: movl a0,K6_0(a3) popl d1 popl a0 popl a2 jmp st_fillr3_array fillr3_array_1: movl d1,(a4) movl a0,4(a4) movl a2,8(a4) addl $12,a4 st_fillr3_array: subl $1,d0 jnc fillr3_array_1 movl K6_0(a3),a0 jmp *a1 create_r_array_4: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size movl d0,a2 shl $4,a2 lea -32+12(a4,a2),a2 cmpl end_heap,a2 jb no_collect_4584 pushl a1 call collect_0l popl a1 no_collect_4584: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 popl a1 test d1,d1 je r_array_4 movl d1,a2 shl $2,a2 subl a2,a3 movl a3,a2 subl $1,d1 copy_a_to_b_lp4: pushl (a2) addl $4,a2 subl $1,d1 jnc copy_a_to_b_lp4 r_array_4: popl d1 movl a0,K6_0(a3) movl a1,4(a3) popl a0 popl a1 popl a2 jmp st_fillr4_array fillr4_array: movl d1,(a4) movl a0,4(a4) movl a1,8(a4) movl a2,12(a4) addl $16,a4 st_fillr4_array: subl $1,d0 jnc fillr4_array movl 4(a3),a1 movl K6_0(a3),a0 jmp *a1 create_r_array_5: pop a1 pop a0 / a0: number of elements, a1: element descriptor / d0: element size-4, d1: element a size movl a0,a2 shl $4,a2 lea 12-32(a4,a2),a2 subl $1,d0 pushl d0 sub_size_lp: lea (a2,a0,4),a2 subl $1,d0 jnc sub_size_lp popl d0 cmpl end_heap,a2 jb no_collect_4585 pushl a1 pushl a0 call collect_0l popl a0 popl a1 no_collect_4585: movl $__ARRAY__+2,(a4) movl a0,4(a4) movl a1,8(a4) popl a1 test d1,d1 je r_array_5 movl d1,a2 shl $2,a2 subl a2,a3 movl a3,a2 subl $1,d1 copy_a_to_b_lp5: pushl (a2) addl $4,a2 subl $1,d1 jnc copy_a_to_b_lp5 r_array_5: movl a4,K6_0(a3) movl a1,4(a3) addl $12,a4 popl d1 popl a1 pushl a3 jmp st_fillr5_array fillr5_array_1: movl d1,(a4) movl a1,4(a4) lea 4(sp),a3 pushl d0 movl K6_0(a3),a2 movl a2,8(a4) movl 4(a3),a2 addl $8,a3 movl a2,12(a4) addl $16,a4 copy_elem_lp5: movl K6_0(a3),a2 addl $4,a3 movl a2,(a4) addl $4,a4 subl $1,d0 jnc copy_elem_lp5 popl d0 st_fillr5_array: subl $1,a0 jnc fillr5_array_1 popl a3 shl $2,d0 movl 4(a3),a1 addl d0,sp movl K6_0(a3),a0 addl $12,sp jmp *a1 #else / in 4(sp): number of elements, (sp): element descriptor / d0: element size, d1: element a size -> a0: array create_R_array: subl $2,d0 jc create_R_array_1 je create_R_array_2 subl $2,d0 jc create_R_array_3 je create_R_array_4 jmp create_R_array_5 create_R_array_1: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size lea -32+12(a4,d0,4),a2 cmpl end_heap,a2 jb no_collect_4581 pushl a1 call collect_0l popl a1 no_collect_4581: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 test d1,d1 je r_array_1_b movl -4(a3),d1 jmp fillr1_array r_array_1_b: movl 4(sp),d1 fillr1_array: movl d0,a1 shr $1,d0 testb $1,a1b je st_fillr1_array_1 movl d1,(a4) addl $4,a4 jmp st_fillr1_array_1 fillr1_array_lp: movl d1,(a4) movl d1,4(a4) addl $8,a4 st_fillr1_array_1: subl $1,d0 jnc fillr1_array_lp ret create_R_array_2: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size lea -32+12(a4,d0,8),a2 cmpl end_heap,a2 jb no_collect_4582 pushl a1 call collect_0 popl a1 no_collect_4582: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 subl $1,d1 jc r_array_2_bb je r_array_2_ab r_array_2_aa: movl -4(a3),d1 movl -8(a3),a2 jmp st_fillr2_array r_array_2_ab: movl -4(a3),d1 movl 4(sp),a2 jmp st_fillr2_array r_array_2_bb: movl 4(sp),d1 movl 8(sp),a2 jmp st_fillr2_array fillr2_array_1: movl d1,(a4) movl a2,4(a4) addl $8,a4 st_fillr2_array: subl $1,d0 jnc fillr2_array_1 ret create_R_array_3: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size lea -32+12(a4,d0,8),a2 lea (a2,d0,4),a2 cmpl end_heap,a2 jb no_collect_4583 pushl a1 call collect_0l popl a1 no_collect_4583: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 popl a1 movl sp,4(a3) test d1,d1 je r_array_3 movl d1,a2 shl $2,a2 negl a2 addl a3,a2 subl $1,d1 copy_a_to_b_lp3: pushl (a2) addl $4,a2 subl $1,d1 jnc copy_a_to_b_lp3 r_array_3: movl a0,K6_0(a3) movl (sp),d1 movl 4(sp),a0 movl 8(sp),a2 movl 4(a3),sp jmp st_fillr3_array fillr3_array_1: movl d1,(a4) movl a0,4(a4) movl a2,8(a4) addl $12,a4 st_fillr3_array: subl $1,d0 jnc fillr3_array_1 movl K6_0(a3),a0 jmp *a1 create_R_array_4: pop a1 pop d0 / d0: number of elements, a1: element descriptor / d1: element a size movl d0,a2 shl $4,a2 lea -32+12(a4,a2),a2 cmpl end_heap,a2 jb no_collect_4584 pushl a1 call collect_0l popl a1 no_collect_4584: movl a4,a0 movl $__ARRAY__+2,(a4) movl d0,4(a4) movl a1,8(a4) addl $12,a4 popl a1 movl sp,8(a3) test d1,d1 je r_array_4 movl d1,a2 shl $2,a2 negl a2 addl a3,a2 subl $1,d1 copy_a_to_b_lp4: pushl (a2) addl $4,a2 subl $1,d1 jnc copy_a_to_b_lp4 r_array_4: movl (sp),d1 movl a0,K6_0(a3) movl a1,4(a3) movl 4(sp),a0 movl 8(sp),a1 movl 12(sp),a2 movl 8(a3),sp jmp st_fillr4_array fillr4_array: movl d1,(a4) movl a0,4(a4) movl a1,8(a4) movl a2,12(a4) addl $16,a4 st_fillr4_array: subl $1,d0 jnc fillr4_array movl 4(a3),a1 movl K6_0(a3),a0 jmp *a1 create_R_array_5: pop a1 pop a0 / a0: number of elements, a1: element descriptor / d0: element size-4, d1: element a size movl a0,a2 shl $4,a2 lea 12-32(a4,a2),a2 subl $1,d0 pushl d0 sub_size_lp: lea (a2,a0,4),a2 subl $1,d0 jnc sub_size_lp popl d0 cmpl end_heap,a2 jb no_collect_4585 pushl a1 pushl a0 call collect_0l popl a0 popl a1 no_collect_4585: movl $__ARRAY__+2,(a4) movl a0,4(a4) movl a1,8(a4) popl a1 movl sp,8(a3) test d1,d1 je r_array_5 movl d1,a2 shl $2,a2 negl a2 addl a3,a2 subl $1,d1 copy_a_to_b_lp5: pushl (a2) addl $4,a2 subl $1,d1 jnc copy_a_to_b_lp5 r_array_5: movl a4,K6_0(a3) movl a1,4(a3) addl $12,a4 movl (sp),d1 movl 4(sp),a1 pushl a3 jmp st_fillr5_array fillr5_array_1: movl d1,(a4) movl a1,4(a4) lea 12(sp),a3 pushl d0 movl K6_0(a3),a2 movl a2,8(a4) movl 4(a3),a2 addl $8,a3 movl a2,12(a4) addl $16,a4 copy_elem_lp5: movl K6_0(a3),a2 addl $4,a3 movl a2,(a4) addl $4,a4 subl $1,d0 jnc copy_elem_lp5 popl d0 st_fillr5_array: subl $1,a0 jnc fillr5_array_1 popl a3 movl 8(a3),sp movl 4(a3),a1 movl K6_0(a3),a0 jmp *a1 #endif #ifndef NEW_DESCRIPTORS yet_args_needed: / for more than 4 arguments mov (a1),d1 movzwl -2(d1),d0 add $3,d0 lea -32(a4,d0,4),a2 cmpl end_heap,a2 jae gc_1 gc_r_1: 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 cp_a: mov (a1),a0 add $4,a1 mov a0,(a4) add $4,a4 subl $1,d0 jge 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 gc_1: call collect_2l jmp gc_r_1 yet_args_needed_0: cmpl end_heap,a4 jae gc_20 gc_r_20: mov a0,4(a4) mov (a1),d0 mov a4,a0 add $8,d0 mov d0,(a4) add $8,a4 ret gc_20: call collect_2 jmp gc_r_20 yet_args_needed_1: cmpl end_heap,a4 jae gc_21 gc_r_21: 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 gc_21: call collect_2 jmp gc_r_21 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 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 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 #endif repl_args_b: test d0,d0 jle repl_args_b_1 dec d0 je repl_args_b_4 mov 8(a0),a1 sub $2,d1 jne repl_args_b_2 mov a1,K6_0(a3) add $4,a3 jmp repl_args_b_4 repl_args_b_2: lea (a1,d0,4),a1 repl_args_b_3: mov -4(a1),a2 sub $4,a1 mov a2,K6_0(a3) add $4,a3 dec d0 jne repl_args_b_3 repl_args_b_4: mov 4(a0),a2 mov a2,K6_0(a3) add $4,a3 repl_args_b_1: ret push_arg_b: cmp $2,d1 jb push_arg_b_1 jne push_arg_b_2 cmp d0,d1 je push_arg_b_1 push_arg_b_2: mov 8(a0),a0 sub $2,d1 push_arg_b_1: mov (a0,d1,4),a0 ret del_args: mov (a0),d1 sub d0,d1 movswl -2(d1),d0 sub $2,d0 jge del_args_2 mov d1,(a1) mov 4(a0),a2 mov a2,4(a1) mov 8(a0),a2 mov a2,8(a1) ret del_args_2: jne del_args_3 mov d1,(a1) mov 4(a0),a2 mov a2,4(a1) mov 8(a0),a2 mov (a2),a2 mov a2,8(a1) ret del_args_3: lea -32(a4,d0,4),a2 cmpl end_heap,a2 jae del_args_gc del_args_r_gc: mov d1,(a1) mov a4,8(a1) mov 4(a0),a2 mov 8(a0),a0 mov a2,4(a1) del_args_copy_args: mov (a0),a2 add $4,a0 mov a2,(a4) add $4,a4 sub $1,d0 jg del_args_copy_args ret del_args_gc: call collect_2l jmp del_args_r_gc #if 0 o__S_P2: mov (a0),d0 mov 8(a0),a0 cmpw $2,-2(d0) je o__S_P2_2 mov (a0),a0 o__S_P2_2: ret ea__S_P2: mov 4(a1),d0 movl $__indirection,(a1) mov a0,4(a1) mov d0,a1 mov (a1),d0 testb $2,d0 jne ea__S_P2_1 mov a0,K6_0(a3) add $4,a3 mov a1,a0 call *d0 mov a0,a1 mov -4(a3),a0 sub $4,a3 ea__S_P2_1: mov (a1),d0 mov 8(a1),a1 cmpw $2,-2(d0) je ea__S_P2_2 mov (a1),a1 ea__S_P2_2: mov (a1),d0 testb $2,d0 jne ea__S_P2_3 sub $20,d0 jmp *d0 ea__S_P2_3: mov d0,(a0) mov 4(a1),a2 mov a2,4(a0) mov 8(a1),a2 mov a2,8(a0) ret #endif #ifdef NOCLIB tan_real: fptan fstsw %ax testb $0x04,%ah fstp %st(0) jnz tan_real_1 ret tan_real_1: fldl NAN_real fstp %st(1) ret asin_real: fld %st(0) fmul %st(0) fsubrl one_real fsqrt fpatan ret acos_real: fld %st(0) fmul %st(0) fsubrl one_real fsqrt fxch %st(1) fpatan ret atan_real: fldl one_real fpatan ret ln_real: fldln2 fxch %st(1) fyl2x ret @c_log10: fldl 4(sp) log10_real: fldlg2 fxch %st(1) fyl2x ret exp_real: fldl2e subl $16, sp fmulp %st(1) fstcw 8(sp) movw 8(sp),%ax andw $0xf3ff,%ax orw $0x0400,%ax movw %ax,10(sp) exp2_real_: fld %st fldcw 10(sp) frndint fldcw 8(sp) fsubr %st,%st(1) fxch %st(1) f2xm1 faddl one_real fscale addl $16,sp fstp %st(1) ret pow_real: sub $16,sp fstcw 8(sp) movw 8(sp),%ax andw $0xf3ff,%ax fxch %st(1) movw %ax,10(sp) fcoml zero_real fnstsw %ax sahf jz pow_zero jc pow_negative pow_real_: fyl2x jmp exp2_real_ pow_negative: fld %st(1) fldcw 10(sp) frndint fistl 12(sp) fldcw 8(sp) fsub %st(2),%st fcompl zero_real fstsw %ax sahf jnz pow_real_ fchs fyl2x fld %st fldcw 10(sp) frndint fldcw 8(sp) fsubr %st,%st(1) fxch %st(1) f2xm1 faddl one_real fscale testl $1,12(sp) fstp %st(1) jz exponent_even fchs exponent_even: add $16,sp ret pow_zero: fld %st(1) fcompl zero_real fnstsw %ax sahf jbe pow_real_ fldl zero_real fstp %st(1) add $16,sp ret r_to_i_real: subl $4,sp fistl (sp) pop d0 ret truncate_real: subl $8,sp fstcw (sp) movw (sp),%ax orw $0x0c00,%ax movw %ax,2(sp) fldcw 2(sp) fistl 4(sp) fldcw (sp) movl 4(sp),d0 addl $8,sp ret entier_real: subl $8,sp fstcw (sp) movw (sp),%ax andw $0xf3ff,%ax orw $0x0400,%ax movw %ax,2(sp) fldcw 2(sp) fistl 4(sp) fldcw (sp) movl 4(sp),d0 addl $8,sp ret ceiling_real: subl $8,sp fstcw (sp) movw (sp),%ax andw $0xf3ff,%ax orw $0x0800,%ax movw %ax,2(sp) fldcw 2(sp) fistl 4(sp) fldcw (sp) movl 4(sp),d0 addl $8,sp ret round__real64: fistpll 12(%ecx) fldz ret truncate__real64: subl $4,sp fstcw (sp) movw (sp),%ax orw $0x0c00,%ax movw %ax,2(sp) fldcw 2(sp) fistpll 12(%ecx) fldcw (sp) addl $4,sp fldz ret entier__real64: subl $4,sp fstcw (sp) movw (sp),%ax andw $0xf3ff,%ax orw $0x0400,%ax movw %ax,2(sp) fldcw 2(sp) fistpll 12(%ecx) fldcw (sp) addl $4,sp fldz ret ceiling__real64: subl $4,sp fstcw (sp) movw (sp),%ax andw $0xf3ff,%ax orw $0x0800,%ax movw %ax,2(sp) fldcw 2(sp) fistpll 12(%ecx) fldcw (sp) addl $4,sp fldz ret int64a__to__real: fildll 12(%ecx) fstp %st(1) ret @c_pow: fldl 4(sp) fldl 12(sp) call pow_real fstp %st(1) ret @c_entier: fldl 4(sp) call entier_real fstp %st(0) ret #else section (tan_real) tan_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @tan add $8,sp ret section (asin_real) asin_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @asin add $8,sp ret section (acos_real) acos_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @acos add $8,sp ret section (atan_real) atan_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @atan add $8,sp ret section (ln_real) ln_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @log add $8,sp ret section (log10_real) log10_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @log10 add $8,sp ret section (exp_real) exp_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @exp add $8,sp ret section (pow_real) pow_real: sub $16,sp fstpl 8(sp) fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @pow add $16,sp ret section (entier_real) entier_real: sub $8,sp fstpl (sp) ffree %st(0) ffree %st(1) ffree %st(2) ffree %st(3) ffree %st(4) ffree %st(5) ffree %st(6) ffree %st(7) call @floor add $8,sp r_to_i_real: fistl int_to_real_scratch movl int_to_real_scratch,d0 ret #endif #ifdef NEW_DESCRIPTORS # include "iap.s" #endif