Passing 685 tests in 64bit including handling of some foreign calls.
This commit is contained in:
		
							parent
							
								
									866b2b1c17
								
							
						
					
					
						commit
						191a82e007
					
				|  | @ -802,10 +802,11 @@ | |||
|                 (fx+ ac 1) | ||||
|                 (case (car x) | ||||
|                   [(byte) (fx+ ac 1)] | ||||
|                   [(relative foreign-label local-relative) | ||||
|                   [(relative local-relative) | ||||
|                    (fx+ ac 4)] | ||||
|                   [(label) ac] | ||||
|                   [(word reloc-word reloc-word+ label-addr current-frame-offset) | ||||
|                   [(word reloc-word reloc-word+ label-addr  | ||||
|                     current-frame-offset foreign-label) | ||||
|                    (+ ac wordsize)] | ||||
|                   [else (die 'compute-code-size "unknown instr" x)]))) | ||||
|           0  | ||||
|  | @ -876,9 +877,9 @@ | |||
|                   [(byte)  | ||||
|                    (code-set! x idx (cdr a)) | ||||
|                    (f (cdr ls) (fx+ idx 1) reloc)] | ||||
|                   [(relative local-relative foreign-label) | ||||
|                   [(relative local-relative) | ||||
|                    (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] | ||||
|                   [(reloc-word reloc-word+ label-addr) | ||||
|                   [(reloc-word reloc-word+ label-addr foreign-label) | ||||
|                    (f (cdr ls) (fx+ idx wordsize) (cons (cons idx a) reloc))] | ||||
|                   [(word) | ||||
|                    (let ([v (cdr a)]) | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 1442 | ||||
| 1443 | ||||
|  |  | |||
|  | @ -29,9 +29,13 @@ | |||
| (define (compile-and-run x)  | ||||
|   (compile1 x) | ||||
|   (let ([rs (system "../src/ikarus -b test64.fasl > test64.out")]) | ||||
|     (unless (= rs 0) (error 'run1 "died")) | ||||
|     (unless (= rs 0) (error 'run1 "died with status" rs)) | ||||
|     (with-input-from-file "test64.out" | ||||
|       (lambda () (get-string-all (current-input-port)))))) | ||||
|       (lambda ()  | ||||
|         (let ([s (get-string-all (current-input-port))]) | ||||
|           (if (eof-object? s)  | ||||
|               "" | ||||
|               s)))))) | ||||
| 
 | ||||
| (define (compile-test-and-run expr expected) | ||||
|   (printf "Compiling:\n") | ||||
|  | @ -233,6 +237,9 @@ | |||
|        (cond | ||||
|          [(assq x env) => (lambda (p) `(set! ,(cdr p) ,v))] | ||||
|          [else (error 'fixup "unbound" x)])] | ||||
|       [(foreign-call ,str ,[arg*] ...)  | ||||
|        (guard (string? str)) | ||||
|        `(foreign-call ',str ,arg* ...)] | ||||
|       [(,[rator] ,[rand*] ...) `(,rator ,rand* ...)] | ||||
|       [,_ (error 'fixup "invalid expression" _)])) | ||||
|   (Expr x '())) | ||||
|  | @ -260,7 +267,10 @@ | |||
|  (include "tests/tests-2.3-req.scm") | ||||
|  (include "tests/tests-2.4-req.scm") | ||||
|  (include "tests/tests-2.6-req.scm") | ||||
|  (include "tests/tests-2.8-req.scm")) | ||||
|  (include "tests/tests-2.8-req.scm") | ||||
|  (include "tests/tests-2.9-req.scm") | ||||
|  ) | ||||
| 
 | ||||
| 
 | ||||
| (current-primitive-locations | ||||
|   (lambda (x)  | ||||
|  | @ -277,8 +287,6 @@ | |||
|       [else (error 'current-primloc "invalid" x)]))) | ||||
| 
 | ||||
| 
 | ||||
| ;(assembler-output #t) | ||||
| 
 | ||||
| (test-all) | ||||
| (printf "Passed ~s tests\n" (length all-tests)) | ||||
| (printf "Happy Happy Joy Joy\n") | ||||
|  |  | |||
|  | @ -124,47 +124,44 @@ L_multi_reentry: | |||
| .align 8
 | ||||
| ik_foreign_call: | ||||
| _ik_foreign_call: | ||||
|   movl %esp, 8(%esi)     # (movl fpr (pcb-ref 'frame-pointer)) | ||||
|   movl %ebp, 0(%esi)     # (movl apr (pcb-ref 'allocation-pointer)) | ||||
|   movl %esp, %ebx        # (movl fpr ebx) | ||||
|   movl 24(%esi), %esp    # (movl (pcb-ref 'system-stack) esp) | ||||
|   movq %rsp, 16(%rsi)    # (movl fpr (pcb-ref 'frame-pointer)) | ||||
|   movq %rbp, 0(%rsi)     # (movl apr (pcb-ref 'allocation-pointer)) | ||||
|   movq %rsp, %rbx        # (movl fpr ebx) | ||||
|   movq 48(%rsi), %rsp    # (movl (pcb-ref 'system-stack) esp) | ||||
|   # %esp is the system stack, %eax is the index to the last arg, | ||||
|   # %esi is the pcb. | ||||
|   # Now, the value of %esp is 16-byte aligned | ||||
|   # we always push %esi (4 bytes) and do a call (4 bytes), | ||||
|   # 0 args require 6 (2) pushes => argc=   0 (0000): %esp +=  -8 | ||||
|   # 1 args require 5 (1) pushes => argc=  -4 (1100): %esp +=  -4 | ||||
|   # 2 args require 4 (0) pushes => argc=  -8 (1000): %esp +=   0 | ||||
|   # 3 args require 3 (3) pushes => argc= -12 (0100): %esp += -12 | ||||
|   movl %eax, %ecx | ||||
|   andl $15, %ecx | ||||
| check_ecx: | ||||
|   cmpl $8, %ecx | ||||
|   je L_zero | ||||
|   cmpl $12, %ecx | ||||
|   je L_one | ||||
|   cmpl $0, %ecx | ||||
|   je L_two | ||||
|   push $0 | ||||
| L_two: | ||||
|   push $0 | ||||
| L_one: | ||||
|   push $0 | ||||
| L_zero: | ||||
|   push %rsi             # (pushl pcr) | ||||
|   cmpl $0, %eax          # (cmpl (int 0) eax) | ||||
|   je L_set               # (je (label Lset)) | ||||
| L_loop:                  # (label Lloop) | ||||
|   movl (%ebx,%eax), %ecx # (movl (mem ebx eax) ecx) | ||||
|   push %rcx             # (pushl ecx) | ||||
|   addl $4, %eax          # (addl (int 4) eax) | ||||
|   cmpl $0, %eax          # (cmpl (int 0) eax) | ||||
|   jne L_loop             # (jne (label Lloop)) | ||||
| 
 | ||||
|   # align the system stack by subtracting 8 if it's not 16-byte aligned | ||||
|   movq %rsp, %r12 | ||||
|   andq $15, %r12 | ||||
|   subq %r12, %rsp | ||||
| 
 | ||||
|   # AMD64 says: %rbp, %rbx, %r12 .. %r15 are preserved by the callee | ||||
|   #             %rdi, %rsi, %rdx, %rcx, %r8, %r9 are parameter regs | ||||
| 
 | ||||
|   movq %rdi, %r12 # put target of call in %r12 | ||||
|   movq %rsi, %r13 # put pcb in %r13 | ||||
| 
 | ||||
|   movq %rsi, %rdi # put pcb in first arg reg | ||||
|   cmpq $0, %rax | ||||
|   je L_zero_args | ||||
|   cmpq $-8, %rax | ||||
|   je L_one_arg | ||||
|   movq $0, %rax | ||||
|   movq %rax,0(%rax) | ||||
| L_one_arg: | ||||
|   movq %rdi, %rsi | ||||
|   movq -8(%rbx), %rdi | ||||
|   jmp L_set | ||||
| 
 | ||||
| L_zero_args: | ||||
| L_set:                   # (label Lset) | ||||
|   call *%rdi             # (call cpr) | ||||
|   movl 8(%esi), %esp     # (movl (pcb-ref 'frame-pointer) fpr) | ||||
|   movl 0(%esi), %ebp     # (movl (pcb-ref 'allocation-pointer) apr) | ||||
|   ret                    # (ret))) | ||||
|   call *%r12             # (call cpr) | ||||
| L_back: | ||||
|   movq %r13, %rsi        # restore pcb from r13 | ||||
|   movq 16(%rsi), %rsp    # get frame pointer from 16(pcb) | ||||
|   movq 0(%rsi), %rbp     # get allocation pointer from 0(pcb) | ||||
|   ret                    # return to scheme | ||||
| 
 | ||||
| #else   | ||||
| 
 | ||||
|  |  | |||
|  | @ -213,7 +213,7 @@ ik_relocate_code(ikptr code){ | |||
|         fprintf(stderr, "failed to find foreign name %s: %s\n", name, err); | ||||
|         exit(-1); | ||||
|       } | ||||
|       ref(data,code_off) = (ikptr)(long)sym; | ||||
|       ref(data,code_off) = (ikptr)sym; | ||||
|       p += (2*wordsize); | ||||
|     } | ||||
|     else { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum