Major work towards the AMD64 port. Most important of which is that

continuations work, more assembly instructions are testing in 64-bit
mode, and some arithmetic operations (shift-right, etc.) have been
fixed by removing some 32-bit dependencies.
This commit is contained in:
Abdulaziz Ghuloum 2008-07-18 01:35:13 -07:00
parent 0ef81aa13e
commit 01c4afa320
18 changed files with 330 additions and 132 deletions

4
c64
View File

@ -2,8 +2,8 @@
cp configure.64.ac configure.ac && \
autoconf && \
./configure CFLAGS="-m64 -I/Users/ikarus/.opt64/include" \
LDFLAGS="-m64 -L/Users/ikarus/.opt64/lib" \
./configure CFLAGS="-m64 -g -I/Users/ikarus/.opt64/include" \
LDFLAGS="-m64 -g -L/Users/ikarus/.opt64/lib" \
&& make clean \
&& make

View File

@ -44,5 +44,5 @@ CLEANFILES=$(nodist_pkglib_DATA) ikarus.config.ss
MAINTAINERCLEANFILES=last-revision
ikarus.boot: $(EXTRA_DIST) ikarus.config.ss
../src/ikarus -b ./ikarus.boot.prebuilt -O2 --r6rs-script makefile.ss
../src/ikarus -b ./ikarus.boot.prebuilt --r6rs-script makefile.ss

View File

@ -379,7 +379,7 @@ ikarus.config.ss: Makefile last-revision ../config.h
echo '(define wordsize $(shell grep SIZEOF_VOID_P ../config.h | sed "s/.*\(.\)/\1/g"))' >>$@
ikarus.boot: $(EXTRA_DIST) ikarus.config.ss
../src/ikarus -b ./ikarus.boot.prebuilt -O2 --r6rs-script makefile.ss
../src/ikarus -b ./ikarus.boot.prebuilt --r6rs-script makefile.ss
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -2369,12 +2369,13 @@
[else (error who "invalid effect" (unparse x))]))
(define (check-disp-arg x k)
(cond
[(mem? x)
[(small-operand? x)
(k x)]
[else
(let ([u (mku)])
(make-seq
(E (make-asm-instr 'move u x))
(k u)))]
[else (k x)]))
(k u)))]))
(define (check-disp x k)
(struct-case x
[(disp a b)
@ -2564,7 +2565,7 @@
[(constant i)
(unless (fixnum? i)
(error who "invalid R/cl" x))
(fxlogand i 31)]
(fxlogand i (- (* wordsize 8) 1))]
[else
(if (eq? x ecx)
'%cl

View File

@ -508,13 +508,19 @@
[(4) (CODE c ac)]
[else (REX.R 0 (CODE c ac))]))
(define (trace-ac ac1 ac2)
(printf "~s\n"
(let f ([ls ac2])
(cond
[(eq? ls ac1) '()]
[else (cons (car ls) (f (cdr ls)))])))
ac2)
(define trace-ac
(let ([cache '()])
(lambda (ac1 what ac2)
(when (assembler-output)
(let ([diff
(let f ([ls ac2])
(cond
[(eq? ls ac1) '()]
[else (cons (car ls) (f (cdr ls)))]))])
(unless (member diff cache)
(set! cache (cons diff cache))
(printf "~s => ~s\n" what diff))))
ac2)))
(define (CR c r ac)
(REX+r r (CODE+r c r ac)))
@ -529,8 +535,8 @@
(CODE c0 (CODE+r c1 r ac)))
;(REX+r r (CODE c0 (CODE+r c1 r ac))))
(define (CCCR* c0 c1 c2 r rm ac)
(CODE c0 (CODE c1 (CODE c2 (RM r rm ac)))))
;(REX+RM r rm (CODE c0 (CODE c1 (CODE c2 (RM r rm ac))))))
;(CODE c0 (CODE c1 (CODE c2 (RM r rm ac)))))
(REX+RM r rm (CODE c0 (CODE c1 (CODE c2 (RM r rm ac))))))
(define (CCI32 c0 c1 i32 ac)
@ -547,15 +553,16 @@
(add-instructions instr ac
[(ret) (CODE #xC3 ac)]
[(cltd) (CODE #x99 ac)]
[(cltd) (C #x99 ac)]
[(movl src dst)
(trace-ac ac `(movl ,src ,dst)
(cond
[(and (imm? src) (reg? dst)) (CR #xB8 dst (IMM src ac))]
[(and (imm? src) (mem? dst)) (CR* #xC7 '/0 dst (IMM32 src ac))]
[(and (reg? src) (reg? dst)) (CR* #x89 src dst ac)]
[(and (reg? src) (mem? dst)) (CR* #x89 src dst ac)]
[(and (mem? src) (reg? dst)) (CR* #x8B dst src ac)]
[else (die who "invalid" instr)])]
[else (die who "invalid" instr)]))]
[(mov32 src dst)
;;; FIXME
(cond
@ -570,7 +577,7 @@
[(and (mem? src) (reg? dst))
(if (= wordsize 4)
(CR* #x8B dst src ac)
(CCR* #x0F #xB7 dst src ac))]
(CR*-no-rex #x8B dst src ac))]
[else (die who "invalid" instr)])]
[(movb src dst)
(cond
@ -583,10 +590,12 @@
[(and (imm8? src) (reg? dst)) (CR* #x83 '/0 dst (IMM8 src ac))]
[(and (imm32? src) (eq? dst '%eax)) (C #x05 (IMM32 src ac))]
[(and (imm32? src) (reg? dst)) (CR* #x81 '/0 dst (IMM32 src ac))]
[(and (reg? src) (reg? dst)) (CR* #x01 src dst ac)]
[(and (reg? src) (reg? dst))
(trace-ac ac `(addl ,src ,dst) (CR* #x01 src dst ac))]
[(and (mem? src) (reg? dst)) (CR* #x03 dst src ac)]
[(and (imm32? src) (mem? dst)) (CR* #x81 '/0 dst (IMM32 src ac))]
[(and (reg? src) (mem? dst)) (CR* #x01 src dst ac)]
[(and (reg? src) (mem? dst))
(trace-ac ac `(addl ,src ,dst) (CR* #x01 src dst ac))]
[else (die who "invalid" instr)])]
[(subl src dst)
(cond
@ -615,14 +624,16 @@
[(and (eq? src '%cl) (mem? dst)) (CR* #xD3 '/5 dst ac)]
[else (die who "invalid" instr)])]
[(sarl src dst)
(trace-ac ac `(sarl ,src ,dst)
(cond
[(and (equal? 1 src) (reg? dst)) (CR* #xD1 '/7 dst ac)]
[(and (imm8? src) (reg? dst)) (CR* #xC1 '/7 dst (IMM8 src ac))]
[(and (imm8? src) (mem? dst)) (CR* #xC1 '/7 dst (IMM8 src ac))]
[(and (imm8? src) (mem? dst)) (CR* #xC1 '/7 dst (IMM8 src ac))]
[(and (eq? src '%cl) (reg? dst)) (CR* #xD3 '/7 dst ac)]
[(and (eq? src '%cl) (mem? dst)) (CR* #xD3 '/7 dst ac)]
[else (die who "invalid" instr)])]
[(and (eq? src '%cl) (mem? dst)) (CR* #xD3 '/7 dst ac)]
[else (die who "invalid" instr)]))]
[(andl src dst)
(trace-ac ac `(andl ,src ,dst)
(cond
[(and (imm32? src) (mem? dst)) (CR* #x81 '/4 dst (IMM32 src ac))]
[(and (imm8? src) (reg? dst)) (CR* #x83 '/4 dst (IMM8 src ac))]
@ -631,7 +642,7 @@
[(and (reg? src) (reg? dst)) (CR* #x21 src dst ac)]
[(and (reg? src) (mem? dst)) (CR* #x21 src dst ac)]
[(and (mem? src) (reg? dst)) (CR* #x23 dst src ac)]
[else (die who "invalid" instr)])]
[else (die who "invalid" instr)]))]
[(orl src dst)
(cond
[(and (imm32? src) (mem? dst)) (CR* #x81 '/1 dst (IMM32 src ac))]
@ -644,12 +655,12 @@
[else (die who "invalid" instr)])]
[(xorl src dst)
(cond
[(and (imm8? src) (reg? dst)) (CR* #x83 '/6 dst (IMM8 src ac))]
[(and (imm8? src) (reg? dst)) (CR* #x83 '/6 dst (IMM8 src ac))]
[(and (imm8? src) (mem? dst)) (CR* #x83 '/6 dst (IMM8 src ac))]
[(and (imm32? src) (eq? dst '%eax)) (CODE #x35 (IMM32 src ac))]
[(and (reg? src) (reg? dst)) (CR* #x31 src dst ac)]
[(and (mem? src) (reg? dst)) (CR* #x33 dst src ac)]
[(and (reg? src) (mem? dst)) (CR* #x31 src dst ac)]
[(and (imm32? src) (eq? dst '%eax)) (CODE #x35 (IMM32 src ac))]
[(and (reg? src) (reg? dst)) (CR* #x31 src dst ac)]
[(and (mem? src) (reg? dst)) (CR* #x33 dst src ac)]
[(and (reg? src) (mem? dst)) (CR* #x31 src dst ac)]
[else (die who "invalid" instr)])]
[(leal src dst)
(cond
@ -657,13 +668,13 @@
[else (die who "invalid" instr)])]
[(cmpl src dst)
(cond
[(and (imm8? src) (reg? dst)) (CR* #x83 '/7 dst (IMM8 src ac))]
[(and (imm32? src) (eq? dst '%eax)) (CODE #x3D (IMM32 src ac))]
[(and (imm8? src) (reg? dst)) (CR* #x83 '/7 dst (IMM8 src ac))]
[(and (imm32? src) (eq? dst '%eax)) (CODE #x3D (IMM32 src ac))]
[(and (imm32? src) (reg? dst)) (CR* #x81 '/7 dst (IMM32 src ac))]
[(and (reg? src) (reg? dst)) (CR* #x39 src dst ac)]
[(and (mem? src) (reg? dst)) (CR* #x3B dst src ac)]
[(and (reg? src) (reg? dst)) (CR* #x39 src dst ac)]
[(and (mem? src) (reg? dst)) (CR* #x3B dst src ac)]
[(and (imm8? src) (mem? dst)) (CR* #x83 '/7 dst (IMM8 src ac))]
[(and (imm32? src) (mem? dst)) (CR* #x81 '/7 dst (IMM32 src ac))]
[(and (imm32? src) (mem? dst)) (CR* #x81 '/7 dst (IMM32 src ac))]
[else (die who "invalid" instr)])]
[(imull src dst)
(cond
@ -721,7 +732,7 @@
[(cvtsi2sd src dst)
(cond
[(and (xmmreg? dst) (reg? src)) (CCCR* #xF2 #x0F #x2A src dst ac)]
[(and (xmmreg? dst) (mem? src)) (CCCR* #xF2 #x0F #x2A dst src ac)]
[(and (xmmreg? dst) (mem? src)) (CCCR* #xF2 #x0F #x2A dst src ac)]
[else (die who "invalid" instr)])]
[(cvtsd2ss src dst)
(cond
@ -834,10 +845,21 @@
(lambda (code idx x)
(cond
[(fixnum? x)
(code-set! code (fx+ idx 0) (fxsll (fxlogand x #x3F) 2))
(code-set! code (fx+ idx 1) (fxlogand (fxsra x 6) #xFF))
(code-set! code (fx+ idx 2) (fxlogand (fxsra x 14) #xFF))
(code-set! code (fx+ idx 3) (fxlogand (fxsra x 22) #xFF))]
(case wordsize
[(4)
(code-set! code (fx+ idx 0) (fxsll (fxlogand x #x3F) 2))
(code-set! code (fx+ idx 1) (fxlogand (fxsra x 6) #xFF))
(code-set! code (fx+ idx 2) (fxlogand (fxsra x 14) #xFF))
(code-set! code (fx+ idx 3) (fxlogand (fxsra x 22) #xFF))]
[else
(code-set! code (fx+ idx 0) (fxsll (fxlogand x #x1F) 3))
(code-set! code (fx+ idx 1) (fxlogand (fxsra x 5) #xFF))
(code-set! code (fx+ idx 2) (fxlogand (fxsra x 13) #xFF))
(code-set! code (fx+ idx 3) (fxlogand (fxsra x 21) #xFF))
(code-set! code (fx+ idx 4) (fxlogand (fxsra x 29) #xFF))
(code-set! code (fx+ idx 5) (fxlogand (fxsra x 37) #xFF))
(code-set! code (fx+ idx 6) (fxlogand (fxsra x 45) #xFF))
(code-set! code (fx+ idx 7) (fxlogand (fxsra x 53) #xFF))])]
[else (die 'set-code-word! "unhandled" x)])))
(define (optimize-local-jumps ls)

View File

@ -2442,7 +2442,10 @@
(lambda (x)
(cond
[(flonum? x) (foreign-call "ikrt_fl_sin" x)]
[(fixnum? x) (foreign-call "ikrt_fx_sin" x)]
[(fixnum? x)
(if (fx=? x 0)
0
(foreign-call "ikrt_fx_sin" x))]
[(number? x) (sin (inexact x))]
[else (die 'sin "not a number" x)])))
@ -2450,7 +2453,10 @@
(lambda (x)
(cond
[(flonum? x) (foreign-call "ikrt_fl_cos" x)]
[(fixnum? x) (foreign-call "ikrt_fx_cos" x)]
[(fixnum? x)
(if (fx=? x 0)
1
(foreign-call "ikrt_fx_cos" x))]
[(number? x) (cos (inexact x))]
[else (die 'cos "not a number" x)])))
@ -2458,7 +2464,10 @@
(lambda (x)
(cond
[(flonum? x) (foreign-call "ikrt_fl_tan" x)]
[(fixnum? x) (foreign-call "ikrt_fx_tan" x)]
[(fixnum? x)
(if (fx=? x 0)
0
(foreign-call "ikrt_fx_tan" x))]
[(number? x) (tan (inexact x))]
[else (die 'tan "not a number" x)])))

View File

@ -433,10 +433,11 @@
(cond
[(fxzero? x) (write-char #\0 p)]
[(fx< x 0)
(write-char #\- p)
(if (fx= x -536870912)
(write-char* "536870912" p)
(loop (fx- 0 x) p))]
(write-char* (fixnum->string x) p)]
;(write-char #\- p)
;(if (fx= x -536870912)
; (write-char* "536870912" p)
; (loop (fx- 0 x) p))]
[else (loop x p)])))
(define write-char*

View File

@ -1 +1 @@
1540
1541

View File

@ -1433,7 +1433,6 @@
[register-callback i]
[input-socket-buffer-size i]
[output-socket-buffer-size i]
[ellipsis-map ]
[optimize-cp i]
[optimize-level i]

View File

@ -51,7 +51,7 @@
(define (smart-dirty-vector-set addr what)
(struct-case what
[(constant t)
(if (or (fixnum? t) (immediate? t))
(if (or (fx? t) (immediate? t))
(prm 'nop)
(dirty-vector-set addr))]
[(known x t)
@ -71,7 +71,7 @@
(define (mem-assign v x i)
(struct-case v
[(constant t)
(if (or (fixnum? t) (immediate? t))
(if (or (fx? t) (immediate? t))
(prm 'mset x (K i) (T v))
(slow-mem-assign v x i))]
[(known expr t)
@ -239,7 +239,7 @@
[else (interrupt)])])
(define (equable? x)
(or (fixnum? x) (not (number? x))))
(or (fx? x) (not (number? x))))
(define-primop memv safe
[(V x ls)
@ -453,7 +453,7 @@
(interrupt-unless-fixnum t)))))
(struct-case idx
[(constant i)
(if (and (fixnum? i) (fx>= i 0))
(if (and (fx? i) (>= i 0))
(check-fx idx)
(check-? idx))]
[(known idx idx-t)
@ -475,7 +475,7 @@
(interrupt-unless (prm 'u< (T idx) len)))))
(struct-case idx
[(constant i)
(if (and (fixnum? i) (fx>= i 0))
(if (and (fx? i) (>= i 0))
(check-fx idx)
(check-? idx))]
[(known idx idx-t)
@ -501,7 +501,7 @@
[(V len)
(struct-case len
[(constant i)
(if (fixnum? i)
(if (and (fx? i) #f)
(interrupt)
(with-tmp ([v (prm 'alloc
(K (align (+ (* i wordsize) disp-vector-data)))
@ -531,7 +531,7 @@
(or
(struct-case i
[(constant i)
(and (fixnum? i)
(and (fx? i)
(fx>= i 0)
(prm 'mref (T x)
(K (+ (* i wordsize) (- disp-vector-data vector-tag)))))]
@ -589,7 +589,7 @@
[(E x i v)
(struct-case i
[(constant i)
(unless (fixnum? i) (interrupt))
(unless (fx? i) (interrupt))
(mem-assign v (T x)
(+ (* i wordsize)
(- disp-vector-data vector-tag)))]
@ -637,7 +637,7 @@
[(V x i)
(struct-case i
[(constant i)
(unless (fixnum? i) (interrupt))
(unless (fx? i) (interrupt))
(prm 'mref (T x)
(K (+ (- disp-closure-data closure-tag)
(* i wordsize))))]
@ -863,7 +863,7 @@
[(V x i)
(struct-case i
[(constant i)
(unless (fixnum? i) (interrupt))
(unless (fx? i) (interrupt))
(prm 'sll (T x) (K i))]
[(known i t) (cogen-value-$fxsll x i)]
[else
@ -875,17 +875,20 @@
[(V x i)
(struct-case i
[(constant i)
(unless (fixnum? i) (interrupt))
(unless (fx? i) (interrupt))
(prm 'logand
(prm 'sra (T x) (K (if (> i 31) 31 i)))
(prm 'sra (T x)
(K (if (< i (* wordsize 8))
i
(- (* wordsize 8) 1))))
(K (* -1 fx-scale)))]
[(known i t) (cogen-value-$fxsra x i)]
[else
(with-tmp ([i (prm 'sra (T i) (K fx-shift))])
(with-tmp ([i (make-conditional
(prm '< i (K 32))
(prm '< i (K (* 8 wordsize)))
i
(K 31))])
(K (- (* 8 wordsize) 1)))])
(prm 'logand
(prm 'sra (T x) i)
(K (* -1 fx-scale)))))])]
@ -1296,7 +1299,7 @@
[else (or* (prm 'logor a (T (car a*))) (cdr a*))]))
(define (known-fixnum? x)
(struct-case x
[(constant i) (fixnum? i)]
[(constant i) (fx? i)]
[(known x t)
(case (T:fixnum? t)
[(yes) (record-optimization 'assert-fixnum x) #t]
@ -1304,7 +1307,7 @@
[else #f]))
(define (known-non-fixnum? x)
(struct-case x
[(constant i) (not (fixnum? i))]
[(constant i) (not (fx? i))]
[(known x t) (eq? (T:fixnum? t) 'no)]
[else #f]))
(let-values ([(fx* others) (partition known-fixnum? (cons a a*))])
@ -1872,7 +1875,7 @@
[(V s i)
(struct-case i
[(constant i)
(unless (fixnum? i) (interrupt))
(unless (fx? i) (interrupt))
(prm 'sra
(prm 'sll
(prm 'logand

85
scheme/run-tests.64.ss Executable file
View File

@ -0,0 +1,85 @@
#!../src/ikarus -b ikarus.boot --r6rs-script
;;; Ikarus Scheme -- A compiler for R6RS Scheme.
;;; Copyright (C) 2006,2007,2008 Abdulaziz Ghuloum
;;;
;;; This program is free software: you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License version 3 as
;;; published by the Free Software Foundation.
;;;
;;; This program is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(import (ikarus)
(tests bitwise-op)
(tests reader)
(tests lists)
(tests bytevectors)
(tests strings)
(tests hashtables)
(tests numerics)
;(tests numbers)
(tests bignums)
(tests fixnums)
(tests div-and-mod)
(tests fxcarry)
(tests bignum-to-flonum)
(tests string-to-number)
(tests input-ports)
(tests fldiv-and-mod)
(tests parse-flonums)
(tests io)
(tests case-folding)
(tests sorting)
(tests fasl)
)
(define (test-exact-integer-sqrt)
(define (f i j inc)
(when (< i j)
(let-values ([(s r) (exact-integer-sqrt i)])
(unless (and (= (+ (* s s) r) i)
(< i (* (+ s 1) (+ s 1))))
(error 'exact-integer-sqrt "wrong result" i))
(f (+ i inc) j inc))))
(f 0 10000 1)
(f 0 536870911 10000)
(f 0 536870911000 536870911)
(printf "[exact-integer-sqrt] Happy Happy Joy Joy\n"))
;(test-bitwise-op)
;(test-parse-flonums)
;(test-case-folding)
;(test-reader)
;(test-char-syntax)
;(test-bytevectors)
;(test-strings)
;(test-exact-integer-sqrt)
;(test-bignum-to-flonum)
;(test-bignum->flonum)
;(test-string-to-number)
;(test-div-and-mod)
;(test-bignums)
;(test-bignum-length)
;(test-fxcarry)
;(test-lists)
;(test-hashtables)
;(test-input-ports)
;(test-bignum-conversion)
;(test-fldiv-and-mod)
;(test-fldiv0-and-mod0)
;(test-fxdiv-and-mod)
;(test-fxdiv0-and-mod0)
;(test-fxlength)
(test-bitwise-bit-count)
;(test-io)
;(test-sorting)
;(test-fasl)
;(test-numerics)
(printf "Happy Happy Joy Joy\n")

View File

@ -18,11 +18,16 @@
(import
(ikarus.compiler)
(match)
(except (ikarus) scc-letrec optimize-cp optimize-level assembler-output))
(except (ikarus) perform-tag-analysis tag-analysis-output
cp0-effort-limit cp0-size-limit expand/optimize
optimizer-output
optimize-cp optimize-level assembler-output))
(define (compile1 x)
(let ([p (open-file-output-port "test64.fasl" (file-options no-fail))])
(parameterize ([assembler-output #t])
(parameterize ([optimize-level 0]
[assembler-output #t])
(compile-core-expr-to-port x p))
(close-output-port p)))

View File

@ -114,8 +114,8 @@ next_gen_tag[generation_count] = {
};
static ikptr
meta_alloc_extending(int size, gc_t* gc, int meta_id){
int mapsize = align_to_next_page(size);
meta_alloc_extending(long int size, gc_t* gc, int meta_id){
long int mapsize = align_to_next_page(size);
if(mapsize < extension_amount[meta_id]){
mapsize = extension_amount[meta_id];
}
@ -151,7 +151,7 @@ meta_alloc_extending(int size, gc_t* gc, int meta_id){
static inline ikptr
meta_alloc(int size, gc_t* gc, int meta_id){
meta_alloc(long int size, gc_t* gc, int meta_id){
assert(size == align(size));
meta_t* meta = &gc->meta[meta_id];
ikptr ap = meta->ap;
@ -252,12 +252,12 @@ gc_alloc_new_data(int size, gc_t* gc){
}
static inline ikptr
gc_alloc_new_code(int size, gc_t* gc){
gc_alloc_new_code(long int size, gc_t* gc){
assert(size == align(size));
if(size < pagesize){
return meta_alloc(size, gc, meta_code);
} else {
int memreq = align_to_next_page(size);
long int memreq = align_to_next_page(size);
ikptr mem = ik_mmap_code(memreq, gc->collect_gen, gc->pcb);
gc->segment_vector = gc->pcb->segment_vector;
qupages_t* p = ik_malloc(sizeof(qupages_t));
@ -374,7 +374,6 @@ extern void verify_integrity(ikpcb* pcb, char*);
ikpcb*
ik_collect(unsigned long int mem_req, ikpcb* pcb){
// fprintf(stderr, "ik_collect\n");
#ifndef NDEBUG
verify_integrity(pcb, "entry");
#endif
@ -483,8 +482,6 @@ ik_collect(unsigned long int mem_req, ikpcb* pcb){
#endif
/* delete all old heap pages */
if(old_heap_pages){
ikpages* p = old_heap_pages;
@ -755,22 +752,22 @@ add_code_entry(gc_t* gc, ikptr entry){
if(ref(x,0) == forward_ptr){
return ref(x,wordsize) + off_code_data;
}
int idx = page_index(x);
long int idx = page_index(x);
unsigned int t = gc->segment_vector[idx];
int gen = t & gen_mask;
if(gen > gc->collect_gen){
return entry;
}
int code_size = unfix(ref(x, disp_code_code_size));
long int code_size = unfix(ref(x, disp_code_code_size));
ikptr reloc_vec = ref(x, disp_code_reloc_vector);
ikptr freevars = ref(x, disp_code_freevars);
ikptr annotation = ref(x, disp_code_annotation);
int required_mem = align(disp_code_data + code_size);
long int required_mem = align(disp_code_data + code_size);
if(required_mem >= pagesize){
int new_tag = gc->collect_gen_tag;
int idx = page_index(x);
long int idx = page_index(x);
gc->segment_vector[idx] = new_tag | code_mt;
int i;
long int i;
for(i=pagesize, idx++; i<required_mem; i+=pagesize, idx++){
gc->segment_vector[idx] = new_tag | data_mt;
}
@ -811,10 +808,10 @@ static void collect_stack(gc_t* gc, ikptr top, ikptr end){
ikptr rp = ref(top, 0);
long int rp_offset = unfix(ref(rp, disp_frame_offset));
if(DEBUG_STACK){
fprintf(stderr, "rp_offset=%ld\n", (long)rp_offset);
fprintf(stderr, "rp_offset=%ld\n", rp_offset);
}
if(rp_offset <= 0){
fprintf(stderr, "invalid rp_offset %ld\n", (long)rp_offset);
fprintf(stderr, "invalid rp_offset %ld\n", rp_offset);
exit(-1);
}
/* since the return point is alive, we need to find the code
@ -891,7 +888,7 @@ static void collect_stack(gc_t* gc, ikptr top, ikptr end){
for(i=0; i<bytes_in_mask; i++, fp-=8){
unsigned char m = mask[i];
#if DEBUG_STACK
fprintf(stderr, "m[%d]=0x%x\n", i, m);
fprintf(stderr, "m[%ld]=0x%x\n", i, m);
#endif
if(m & 0x01) { fp[-0] = add_object(gc, fp[-0], "frame0"); }
if(m & 0x02) { fp[-1] = add_object(gc, fp[-1], "frame1"); }
@ -1334,9 +1331,9 @@ relocate_new_code(ikptr x, gc_t* gc){
#endif
obj = add_object(gc, obj, "reloc3");
ikptr displaced_object = obj + obj_off;
ikptr next_word = code + code_off + wordsize;
long int next_word = code + code_off + 4;
ikptr relative_distance = displaced_object - (long int)next_word;
ref(next_word, -wordsize) = relative_distance;
*((int*)(code+code_off)) = relative_distance;
p += (3*wordsize);
}
else if(tag == 1){

View File

@ -206,7 +206,7 @@ ikptr ik_unsafe_alloc(ikpcb* pcb, int size);
ikptr ik_safe_alloc(ikpcb* pcb, int size);
#define IK_HEAP_EXT_SIZE (32 * 4096)
#define IK_HEAPSIZE (1024 * ((wordsize==4)?1:2) * 4096) /* 4/8 MB */
#define IK_HEAPSIZE (1024 * ((wordsize==4)?1:16) * 4096) /* 4/8 MB */
#define wordsize ((int)(sizeof(ikptr)))
#define wordshift ((wordsize == 4)?2:3)

View File

@ -67,10 +67,8 @@ _ik_asm_enter:
.byte 0
.byte 0
L_multivalue_label: # FIXME
.long 0 # 2 longs
.long 0 # for return address
.byte 0
.byte 0
.quad L_multivalue_underflow
.quad 0
L_call:
call *%rax # goooooooo
# now we're back
@ -91,6 +89,7 @@ L_do_underflow:
mov -40(%rsp), %r14 # restore
mov -48(%rsp), %r15 # restore
ret # back to C, which handled the underflow
multivalue_underflow:
L_multivalue_underflow:
add $8, %rsp
jmp L_do_underflow
@ -109,10 +108,21 @@ _ik_asm_reenter:
# scheme stack is second arg 8(%esp) %rsi
# pcb is the first arg 4(%esp) %rdi
# return point is at 0(%esp)
mov %rbp, -8(%rsp) # preserve
mov %rbx, -16(%rsp) # preserve
mov %r12, -24(%rsp) # preserve
mov %r13, -32(%rsp) # preserve
mov %r14, -40(%rsp) # preserve
mov %r15, -48(%rsp) # preserve
movq %rdx, %rax # third arg -> argc
movq %rsi, %rbx # second arg -> rbx (scheme stack)
movq %rdi, %rsi # first arg -> pcb
movq 0(%rsi), %rbp # allocation pointer is at 0(pcb)
subq $64, %rsp # for alignment
movq %rsp, 48(%rsi) # save esp in pcb->system_stack
movq %rbx, %rsp # load scheme stack from rbx
cmpq $-8, %rax
@ -120,10 +130,8 @@ _ik_asm_reenter:
movq -8(%rsp), %rax
ret
L_multi_reentry:
movq $0, %rax
movq %rax, 0(%rax)
movq 0(%rsp), %rbx
jmp *-9(%rbx)
jmp *-18(%rbx)
.align 8

View File

@ -25,7 +25,7 @@
typedef struct {
ikptr tag;
ikptr top;
int size;
long int size;
ikptr next;
} cont;

View File

@ -29,8 +29,11 @@
(((unsigned long int)(x)) & bignum_sign_mask)
#define most_positive_fixnum 0x1FFFFFFF
#define most_negative_fixnum 0x20000000
#define most_positive_fixnum \
(((unsigned long int)-1) >> (fx_shift+1))
#define most_negative_fixnum (most_positive_fixnum+1)
// #define most_positive_fixnum 0x1FFFFFFF
// #define most_negative_fixnum 0x20000000
#define max_digits_per_limb 10
@ -1062,9 +1065,9 @@ copy_limbs(mp_limb_t* src, mp_limb_t* dst, int n1, int n2){
}
static void
bits_compliment(mp_limb_t* src, mp_limb_t* dst, int n){
bits_compliment(mp_limb_t* src, mp_limb_t* dst, long int n){
mp_limb_t carry = 1;
int i;
long int i;
for(i=0; i<n; i++){
mp_limb_t d = src[i];
mp_limb_t c = carry + ~ d;
@ -1107,8 +1110,8 @@ bits_compliment_carry(mp_limb_t* src, mp_limb_t* dst, int n1, int n2, mp_limb_t
static void
bits_compliment_with_carry(mp_limb_t* src, mp_limb_t* dst, int n, int carry){
int i;
bits_compliment_with_carry(mp_limb_t* src, mp_limb_t* dst, long int n, long int carry){
long int i;
for(i=0; i<n; i++){
mp_limb_t d = src[i];
mp_limb_t c = carry + ~ d;
@ -1145,8 +1148,8 @@ bits_compliment_logor(mp_limb_t* s1, mp_limb_t* s2, mp_limb_t* dst, int n){
}
static int
bits_carry(mp_limb_t* s, int n){
static long int
bits_carry(mp_limb_t* s, int n){
/*
int carry = 1;
int i;
@ -1482,20 +1485,20 @@ copy_bits_shifting_right(mp_limb_t* src, mp_limb_t* dst, int n, int m){
int i;
for(i=1; i<n; i++){
mp_limb_t b = src[i];
dst[i-1] = (b << (32-m)) | carry;
dst[i-1] = (b << (mp_bits_per_limb-m)) | carry;
carry = b >> m;
}
dst[n-1] = carry;
}
static void
copy_bits_shifting_left(unsigned int* src, unsigned int* dst, int n, int m){
unsigned int carry = 0;
int i;
copy_bits_shifting_left(unsigned long int* src, unsigned long int* dst, int n, int m){
unsigned long int carry = 0;
long int i;
for(i=0; i<n; i++){
unsigned int b = src[i];
unsigned long int b = src[i];
dst[i] = (b << m) | carry;
carry = b >> (32-m);
carry = b >> (mp_bits_per_limb-m);
}
dst[n] = carry;
}
@ -1506,11 +1509,12 @@ copy_bits_shifting_left(unsigned int* src, unsigned int* dst, int n, int m){
ikptr
ikrt_bignum_shift_right(ikptr x, ikptr y, ikpcb* pcb){
int limb_shift = (wordsize == 4 ? 5 : 6);
long int m = unfix(y);
ikptr fst = ref(x, -vector_tag);
long int n = bnfst_limb_count(fst);
long int whole_limb_shift = m >> 5; /* FIXME: 5 are the bits in 32-bit num */
int bit_shift = m & 31;
long int whole_limb_shift = m >> limb_shift;
long int bit_shift = m & (mp_bits_per_limb-1);
long int new_limb_count = n - whole_limb_shift;
if(bnfst_negative(fst)){
if(new_limb_count <= 0){
@ -1545,7 +1549,7 @@ ikrt_bignum_shift_right(ikptr x, ikptr y, ikpcb* pcb){
new_limb_count,
bit_shift);
*((mp_limb_t*)(r+disp_bignum_data+(new_limb_count-1)*wordsize))
|= (-1 << (32 - bit_shift));
|= (-1L << (mp_bits_per_limb - bit_shift));
bits_compliment(
(mp_limb_t*)(long)(r+disp_bignum_data),
(mp_limb_t*)(long)(r+disp_bignum_data),
@ -1580,21 +1584,22 @@ ikrt_bignum_shift_right(ikptr x, ikptr y, ikpcb* pcb){
ikptr
ikrt_fixnum_shift_left(ikptr x, ikptr y, ikpcb* pcb){
int m = unfix(y);
int n = unfix(x);
int limb_count = (m >> 5) + 2; /* FIXME: 5 are the bits in 32-bit num */
int bit_shift = m & 31;
int limb_shift = (wordsize == 4 ? 5 : 6);
long int m = unfix(y);
long int n = unfix(x);
long int limb_count = (m >> limb_shift) + 2;
long int bit_shift = m & (mp_bits_per_limb-1);
ikptr r = ik_safe_alloc(pcb, align(disp_bignum_data + limb_count * wordsize));
unsigned int* s = (unsigned int*)(long)(r+disp_bignum_data);
unsigned long int* s = (unsigned long int*)(long)(r+disp_bignum_data);
bzero(s, limb_count * wordsize);
if(n >= 0){
if(bit_shift){
s[limb_count-1] = n >> (32 - bit_shift);
s[limb_count-1] = n >> (mp_bits_per_limb - bit_shift);
}
s[limb_count-2] = n << bit_shift;
} else {
if(bit_shift){
s[limb_count-1] = (-n) >> (32 - bit_shift);
s[limb_count-1] = (-n) >> (mp_bits_per_limb - bit_shift);
}
s[limb_count-2] = (-n) << bit_shift;
}
@ -1604,11 +1609,12 @@ ikrt_fixnum_shift_left(ikptr x, ikptr y, ikpcb* pcb){
ikptr
ikrt_bignum_shift_left(ikptr x, ikptr y, ikpcb* pcb){
int limb_shift = (wordsize == 4 ? 5 : 6);
long int m = unfix(y);
ikptr fst = ref(x, -vector_tag);
long int n = bnfst_limb_count(fst);
long int whole_limb_shift = m >> 5; /* FIXME: 5 are the bits in 32-bit num */
long int bit_shift = m & 31;
long int whole_limb_shift = m >> limb_shift;
long int bit_shift = m & (mp_bits_per_limb-1);
if(bit_shift == 0){
long int limb_count = n + whole_limb_shift;
pcb->root0 = &x;
@ -1627,8 +1633,8 @@ ikrt_bignum_shift_left(ikptr x, ikptr y, ikpcb* pcb){
unsigned int* s = (unsigned int*)(long)(r+disp_bignum_data);
bzero(s, whole_limb_shift*wordsize);
copy_bits_shifting_left(
(unsigned int*)(long)(x+off_bignum_data),
s+whole_limb_shift,
(unsigned long int*)(long)(x+off_bignum_data),
(unsigned long int*)(long)(s+whole_limb_shift),
n,
bit_shift);
return normalize_bignum(limb_count, bnfst_negative(fst), r);
@ -1743,7 +1749,7 @@ usages, qxn will be zero.
ikptr
ikrt_bnfxdivrem(ikptr x, ikptr y, ikpcb* pcb){
int yint = unfix(y);
long int yint = unfix(y);
ikptr fst = ref(x, -vector_tag);
mp_size_t s2n = bnfst_limb_count(fst);
pcb->root0 = &x;
@ -1755,7 +1761,7 @@ ikrt_bnfxdivrem(ikptr x, ikptr y, ikpcb* pcb){
0,
s2p,
s2n,
abs(yint));
labs(yint));
ikptr rem;
@ -1951,11 +1957,73 @@ all_zeros(mp_limb_t* start, mp_limb_t* end){
}
#define PRECISION 53
static ikptr
ikrt_bignum_to_flonum64(ikptr bn, ikptr more_bits, ikptr fl){
ikptr fst = ref(bn, -vector_tag);
long int limb_count = bnfst_limb_count(fst);
mp_limb_t* sp = (mp_limb_t*)(long)(bn+off_bignum_data);
double pos_result;
if(limb_count == 1){
pos_result = sp[0];
} else if (limb_count == 2){
mp_limb_t lo = sp[0];
mp_limb_t hi = sp[1];
pos_result = hi;
pos_result = pos_result * 4294967296.0;
pos_result = pos_result + lo;
} else {
mp_limb_t hi = sp[limb_count-1];
mp_limb_t mi = sp[limb_count-2];
int bc = limb_size(hi);
if(bc < 32){
mp_limb_t lo = sp[limb_count-3];
hi = (hi << (32-bc)) | (mi >> bc);
mi = (mi << (32-bc)) | (lo >> bc);
}
/* now hi has 32 full bits, and mi has 32 full bits */
mp_limb_t mask = ((1<<(64-PRECISION)) - 1);
if((mi & mask) == ((mask+1)>>1)){
/* exactly at break point */
if(((sp[limb_count-3] << (32-bc)) == 0) &&
all_zeros(sp, sp+limb_count-4) &&
(more_bits == 0)){
if(mi & (1<<(64-PRECISION))){
/* odd number, round to even */
mi = mi | mask;
}
} else {
/* round up */
mi = mi | mask;
}
} else if ((mi & mask) > ((mask+1)>>1)){
/* also round up */
mi = mi | mask;
} else {
/* keep it to round down */
}
pos_result = hi;
pos_result = pos_result * 4294967296.0;
pos_result = pos_result + mi;
int bignum_bits = bc + (mp_bits_per_limb * (limb_count-1));
int exponent = bignum_bits - (2 * mp_bits_per_limb);
while(exponent){
pos_result *= 2.0;
exponent -= 1;
}
}
if(bnfst_negative(fst)){
flonum_data(fl) = - pos_result;
} else {
flonum_data(fl) = pos_result;
}
return fl;
}
ikptr
ikrt_bignum_to_flonum(ikptr bn, ikptr more_bits, ikptr fl){
if(mp_bits_per_limb != 32){
fprintf(stderr, "ikarus BUG: bignum_to_flonum only works in 32bit now\n");
exit(-1);
if(mp_bits_per_limb == 64){
return ikrt_bignum_to_flonum64(bn, more_bits, fl);
}
ikptr fst = ref(bn, -vector_tag);
long int limb_count = bnfst_limb_count(fst);

View File

@ -239,8 +239,8 @@ ik_mmap(int size){
#endif
memset(mem, -1, mapsize);
#ifndef NDEBUG
fprintf(stderr, "MMAP 0x%08x .. 0x%08x\n", (int)mem,
((int)(mem))+mapsize-1);
fprintf(stderr, "MMAP 0x%016lx .. 0x%016lx\n", (long int)mem,
((long int)(mem))+mapsize-1);
#endif
return (ikptr)(long)mem;
}
@ -492,7 +492,7 @@ void ik_error(ikptr args){
void ik_stack_overflow(ikpcb* pcb){
#ifndef NDEBUG
fprintf(stderr, "entered ik_stack_overflow pcb=0x%08x\n", (int)pcb);
fprintf(stderr, "entered ik_stack_overflow pcb=0x%016lx\n", (long int)pcb);
#endif
set_segment_type(pcb->stack_base, pcb->stack_size, data_mt, pcb);