diff --git a/src/ikarus.boot b/src/ikarus.boot index 8cba868..dc981a2 100644 Binary files a/src/ikarus.boot and b/src/ikarus.boot differ diff --git a/src/ikarus.intel-assembler.ss b/src/ikarus.intel-assembler.ss index 1e51a49..17e7591 100644 --- a/src/ikarus.intel-assembler.ss +++ b/src/ikarus.intel-assembler.ss @@ -478,6 +478,13 @@ [(and (xmmreg? src) (or (xmmreg? dst) (mem? dst))) (CODE #xF2 (CODE #x0F ((CODE/digit #x11 src) dst ac)))] [else (error who "invalid ~s" instr)])] + [(cvtsi2sd src dst) + (cond + [(and (xmmreg? dst) (reg? src)) + (CODE #xF2 (CODE #x0F (CODE #x2A (ModRM 3 src dst ac))))] + [(and (xmmreg? dst) (mem? src)) + (CODE #xF2 (CODE #x0F ((CODE/digit #x2A dst) src ac)))] + [else (error who "invalid ~s" instr)])] [(addsd src dst) (cond [(and (xmmreg? dst) (or (xmmreg? src) (mem? src))) diff --git a/src/ikarus.numerics.ss b/src/ikarus.numerics.ss index a2ef270..ce646cc 100644 --- a/src/ikarus.numerics.ss +++ b/src/ikarus.numerics.ss @@ -152,8 +152,7 @@ sin cos atan sqrt flround flmax)) - (define (fixnum->flonum x) - (foreign-call "ikrt_fixnum_to_flonum" x)) +; (foreign-call "ikrt_fixnum_to_flonum" x)) (module (bignum->flonum) ; sbe f6 f5 f4 f3 f2 f1 f0 @@ -362,7 +361,7 @@ [(bignum? y) (foreign-call "ikrt_fxbnplus" x y)] [(flonum? y) - ($fl+ (fixnum->flonum x) y)] + ($fl+ ($fixnum->flonum x) y)] [(ratnum? y) ($make-ratnum (+ (* x ($ratnum-d y)) ($ratnum-n y)) @@ -386,7 +385,7 @@ [(flonum? x) (cond [(fixnum? y) - ($fl+ x (fixnum->flonum y))] + ($fl+ x ($fixnum->flonum y))] [(bignum? y) ($fl+ x (bignum->flonum y))] [(flonum? y) @@ -445,7 +444,7 @@ [(flonum? y) (if ($fx= x 0) ($fl* y -1.0) - ($fl- (fixnum->flonum x) y))] + ($fl- ($fixnum->flonum x) y))] [(ratnum? y) (let ([n ($ratnum-n y)] [d ($ratnum-d y)]) (binary/ (binary- (binary* d x) n) d))] @@ -467,7 +466,7 @@ [(flonum? x) (cond [(fixnum? y) - ($fl- x (fixnum->flonum y))] + ($fl- x ($fixnum->flonum y))] [(bignum? y) ($fl- x (bignum->flonum y))] [(flonum? y) @@ -500,7 +499,7 @@ [(bignum? y) (foreign-call "ikrt_fxbnmult" x y)] [(flonum? y) - ($fl* (fixnum->flonum x) y)] + ($fl* ($fixnum->flonum x) y)] [(ratnum? y) (binary/ (binary* x ($ratnum-n y)) ($ratnum-d y))] [else @@ -520,7 +519,7 @@ [(flonum? x) (cond [(fixnum? y) - ($fl* x (fixnum->flonum y))] + ($fl* x ($fixnum->flonum y))] [(bignum? y) ($fl* x (bignum->flonum y))] [(flonum? y) @@ -684,13 +683,13 @@ [(flonum? x) (cond [(flonum? y) ($fl/ x y)] - [(fixnum? y) ($fl/ x (fixnum->flonum y))] + [(fixnum? y) ($fl/ x ($fixnum->flonum y))] [(bignum? y) ($fl/ x (bignum->flonum y))] [(ratnum? y) ($fl/ x (ratnum->flonum y))] [else (error '/ "unspported ~s ~s" x y)])] [(fixnum? x) (cond - [(flonum? y) ($fl/ (fixnum->flonum x) y)] + [(flonum? y) ($fl/ ($fixnum->flonum x) y)] [(fixnum? y) (cond [($fx= y 0) (error '/ "division by 0")] @@ -936,7 +935,7 @@ (define exact->inexact (lambda (x) (cond - [(fixnum? x) (fixnum->flonum x)] + [(fixnum? x) ($fixnum->flonum x)] [(bignum? x) (bignum->flonum x)] [(ratnum? x) (binary/ (exact->inexact ($ratnum-n x)) ($ratnum-d x))] @@ -1201,11 +1200,11 @@ (define-syntax flfl? (syntax-rules () [(_ x y) (fl? x y)])) (define-syntax flfx? - (syntax-rules () [(_ x y) (fl? x (fixnum->flonum y))])) + (syntax-rules () [(_ x y) (fl? x ($fixnum->flonum y))])) (define-syntax flbn? (syntax-rules () [(_ x y) (fl? x (bignum->flonum y))])) (define-syntax fxfl? - (syntax-rules () [(_ x y) (fl? (fixnum->flonum x) y)])) + (syntax-rules () [(_ x y) (fl? ($fixnum->flonum x) y)])) (define-syntax bnfl? (syntax-rules () [(_ x y) (fl? (bignum->flonum x) y)])))])) diff --git a/src/libaltcogen.ss b/src/libaltcogen.ss index acf20e4..395b3b8 100644 --- a/src/libaltcogen.ss +++ b/src/libaltcogen.ss @@ -443,7 +443,8 @@ (make-asm-instr op (make-disp (car s*) (cadr s*)) (caddr s*))))] - [(fl:load fl:store fl:add! fl:sub! fl:mul! fl:div!) + [(fl:load fl:store fl:add! fl:sub! fl:mul! fl:div! + fl:from-int) (S* rands (lambda (s*) (make-asm-instr op (car s*) (cadr s*))))] @@ -1398,7 +1399,7 @@ (mark-reg/vars-conf! edx vs) (R s vs (rem-reg edx rs) fs ns)] [(mset bset/c bset/h fl:load fl:store fl:add! fl:sub! - fl:mul! fl:div!) + fl:mul! fl:div! fl:from-int) (R* (list s d) vs rs fs ns)] [else (error who "invalid effect op ~s" (unparse x))])] [(ntcall target value args mask size) @@ -1602,7 +1603,8 @@ [(logand logor logxor int+ int- int* mset bset/c bset/h sll sra srl cltd idiv int-/overflow int+/overflow int*/overflow - fl:load fl:store fl:add! fl:sub! fl:mul! fl:div!) + fl:load fl:store fl:add! fl:sub! fl:mul! fl:div! + fl:from-int) (make-asm-instr op (R d) (R s))] [(nop) (make-primcall 'nop '())] [else (error who "invalid op ~s" op)])] @@ -1848,7 +1850,8 @@ s)) (set-union (set-union (R eax) (R edx)) (set-union (R v) s)))] - [(mset fl:load fl:store fl:add! fl:sub! fl:mul! fl:div!) + [(mset fl:load fl:store fl:add! fl:sub! fl:mul! fl:div! + fl:from-int) (set-union (R v) (set-union (R d) s))] [else (error who "invalid effect ~s" x)])] [(seq e0 e1) (E e0 (E e1 s))] @@ -2180,6 +2183,7 @@ (E (make-asm-instr 'move u a)) (E (make-asm-instr op u b))))] [else x])] + [(fl:from-int) x] [else (error who "invalid effect ~s" op)])] [(primcall op rands) (case op @@ -2461,6 +2465,8 @@ (cons `(movsd xmm0 ,(R (make-disp s d))) ac)] [(fl:load) (cons `(movsd ,(R (make-disp s d)) xmm0) ac)] + [(fl:from-int) + (cons `(cvtsi2sd ,(R s) xmm0) ac)] [(fl:add!) (cons `(addsd ,(R (make-disp s d)) xmm0) ac)] [(fl:sub!) diff --git a/src/pass-specify-rep-primops.ss b/src/pass-specify-rep-primops.ss index d836664..040984b 100644 --- a/src/pass-specify-rep-primops.ss +++ b/src/pass-specify-rep-primops.ss @@ -777,7 +777,9 @@ [(V fx) (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) (prm 'mset x (K (- vector-tag)) (K flonum-tag)) - (prm 'fl:from-int (prm 'sll (T fx) (K fx-shift))) + (prm 'fl:from-int + (K 0) ; dummy + (prm 'sra (T fx) (K fx-shift))) (prm 'fl:store x (K (- disp-flonum-data vector-tag))) x)])