Marc Feeley wrote:
Are you sure TCC implements floating point?
Well, this code works:
(define (functor:vector-* length make ref vset!) (lambda (v fact) (let* ((len (length v)) (out (make len))) (let lp ((i 0)) (if (< i len) (begin (let () (declare (flonum) (not safe)) (vset! out i (* fact (ref v i)))) (lp (inc i))))) out)))
(define f64vector-* (functor:vector-* f64vector-length make-f64vector f64vector-ref f64vector-set!))
(define f32vector-* (functor:vector-* f32vector-length make-f32vector f32vector-ref f32vector-set!))
(TEST ;;(<- syntax from unreleased cj-test module)
(f64vector-* '#f64(1.2 3.2 0.4) 2.3123123124213153251253)
#f64(2.7747747749055782 7.3993993997482095 .9249249249685262)
(f32vector-* '#f32(1.2 3.2 0.4) 2.3123123124213153251253)
#f32(2.7747747898101807 7.399399280548096 .924924910068512) )
There is one "mul" opcode in the disassembly:
... 2868: dd d9 fstp %st(1) 286a: dd 45 b8 fldl 0xffffffb8(%ebp) 286d: dc 4d b0 fmull 0xffffffb0(%ebp) 2870: dd 55 a8 fstl 0xffffffa8(%ebp) 2873: dd d9 fstp %st(1) 2875: 8b 45 d4 mov 0xffffffd4(%ebp),%eax 2878: 83 c0 10 add $0x10,%eax ...
I'm surprised that there's only one occurrence of an opcode containing "mul" in it's name, when both 32 and 64 bit operations are being performed. But I don't really know x86 assembly.
I'll look into my problematic code more closely, it may actually be the included foreign C code (written by me and others) which is at fault.
Christian.