/* -*-C-*-
-$Id: dfloat.c,v 1.4 1993/06/24 07:07:55 gjr Exp $
+$Id: dfloat.c,v 1.5 1993/12/05 06:08:10 cph Exp $
-Copyright (c) 1991 Massachusetts Institute of Technology
+Copyright (c) 1991-93 Massachusetts Institute of Technology
This material was developed by the Scheme project at the Massachusetts
Institute of Technology, Department of Electrical Engineering and
#include "scheme.h"
#include "prims.h"
\f
-#define FLONUM_SIZE (BYTES_TO_WORDS (sizeof (double)))
-
-#define ARG_DOUBLE_VECTOR(argument_number) \
- ((FLONUM_P (ARG_REF (argument_number))) \
- ? (ARG_REF (argument_number)) \
- : ((error_wrong_type_arg (argument_number)), ((SCHEME_OBJECT) 0)))
-
-#define ARG_DOUBLE_VECTOR_INDEX(argument_number, vector) \
- (arg_index_integer (argument_number, \
- ((VECTOR_LENGTH (vector)) / FLONUM_SIZE)))
+#define FLOATING_VECTOR_INDEX_ARG(argument_number, vector) \
+ (arg_index_integer ((argument_number), (FLOATING_VECTOR_LENGTH (vector))))
DEFINE_PRIMITIVE ("FLOATING-VECTOR-CONS", Prim_floating_vector_cons, 1, 1, 0)
{
- long length = (arg_nonnegative_integer (1));
- long length_in_words = length * FLONUM_SIZE;
- SCHEME_OBJECT result;
- fast double *vect;
-
PRIMITIVE_HEADER (1);
- ALIGN_FLOAT (Free);
- Primitive_GC_If_Needed(length_in_words + 1);
- result = (MAKE_POINTER_OBJECT (TC_BIG_FLONUM, Free));
- *Free++ = (MAKE_OBJECT (TC_MANIFEST_NM_VECTOR, length_in_words));
- vect = (double *) Free;
- while ((length--) > 0) (*vect++) = 0.0;
- Free = (SCHEME_OBJECT *) vect;
- PRIMITIVE_RETURN (result);
+ {
+ long length = (arg_nonnegative_integer (1));
+ long length_in_words = (length * FLONUM_SIZE);
+ SCHEME_OBJECT result;
+ fast double *vect;
+
+ ALIGN_FLOAT (Free);
+ Primitive_GC_If_Needed (length_in_words + 1);
+ result = (MAKE_POINTER_OBJECT (TC_BIG_FLONUM, Free));
+ (*Free++) = (MAKE_OBJECT (TC_MANIFEST_NM_VECTOR, length_in_words));
+ vect = ((double *) Free);
+ while ((length--) > 0) (*vect++) = 0.0;
+ Free = ((SCHEME_OBJECT *) vect);
+ PRIMITIVE_RETURN (result);
+ }
}
-DEFINE_PRIMITIVE( "FLOATING-VECTOR-REF", Prim_floating_vector_ref,
- 2, 2, 0)
-{ SCHEME_OBJECT vector = ARG_DOUBLE_VECTOR(1);
- long index = ARG_DOUBLE_VECTOR_INDEX(2, vector);
- double *where = ((double *) VECTOR_LOC(vector, (index * FLONUM_SIZE)));
-
+DEFINE_PRIMITIVE ("FLOATING-VECTOR-REF", Prim_floating_vector_ref, 2, 2, 0)
+{
PRIMITIVE_HEADER (2);
- Primitive_GC_If_Needed(FLONUM_SIZE + 1);
- PRIMITIVE_RETURN (FLOAT_TO_FLONUM(*where));
+ {
+ SCHEME_OBJECT vector = (FLOATING_VECTOR_ARG (1));
+ Primitive_GC_If_Needed (FLONUM_SIZE + 1);
+ PRIMITIVE_RETURN
+ (FLOAT_TO_FLONUM
+ (FLOATING_VECTOR_REF (vector,
+ (FLOATING_VECTOR_INDEX_ARG (2, vector)))));
+ }
}
extern double EXFUN (arg_flonum, (int));
-DEFINE_PRIMITIVE( "FLOATING-VECTOR-SET!", Prim_floating_vector_set,
- 3, 3, 0)
-{ SCHEME_OBJECT vector = ARG_DOUBLE_VECTOR(1);
- long index = ARG_DOUBLE_VECTOR_INDEX(2, vector);
- double new_value = arg_flonum(3);
- double * where = ((double *) VECTOR_LOC(vector, (index * FLONUM_SIZE)));
-
+DEFINE_PRIMITIVE ("FLOATING-VECTOR-SET!", Prim_floating_vector_set, 3, 3, 0)
+{
PRIMITIVE_HEADER (3);
- /* Primitive_GC_If_Needed(FLONUM_SIZE + 1); */
- *where = new_value;
- /* double value = *where; */
- PRIMITIVE_RETURN (SHARP_F);
+ {
+ SCHEME_OBJECT vector = (FLOATING_VECTOR_ARG (1));
+ FLOATING_VECTOR_SET
+ (vector,
+ (FLOATING_VECTOR_INDEX_ARG (2, vector)),
+ (arg_flonum (3)));
+ }
+ PRIMITIVE_RETURN (UNSPECIFIC);
}
-DEFINE_PRIMITIVE ("FLOATING-VECTOR-LENGTH", Prim_floating_vector_length,
- 1, 1, 0)
+DEFINE_PRIMITIVE ("FLOATING-VECTOR-LENGTH", Prim_floating_vector_length, 1, 1,
+ 0)
{
- SCHEME_OBJECT vector = (ARG_DOUBLE_VECTOR (1));
PRIMITIVE_HEADER (1);
-
PRIMITIVE_RETURN
- (LONG_TO_UNSIGNED_FIXNUM ((VECTOR_LENGTH (vector)) / FLONUM_SIZE));
+ (LONG_TO_UNSIGNED_FIXNUM
+ (FLOATING_VECTOR_LENGTH (FLOATING_VECTOR_ARG (1))));
}
/* -*-C-*-
-$Id: object.h,v 9.43 1993/10/14 19:19:02 gjr Exp $
+$Id: object.h,v 9.44 1993/12/05 06:07:52 cph Exp $
Copyright (c) 1987-1993 Massachusetts Institute of Technology
/* Flonum Operations */
+#define FLONUM_SIZE (BYTES_TO_WORDS (sizeof (double)))
+
#define FLONUM_TO_DOUBLE(object) \
(* ((double *) (MEMORY_LOC ((object), 1))))
#define FLONUM_TRUNCATE(object) \
(double_to_flonum (double_truncate (FLONUM_TO_DOUBLE (object))))
+/* Flonum-vector Operations */
+
+#define FLOATING_VECTOR_LENGTH(vector) \
+ ((VECTOR_LENGTH (vector)) / FLONUM_SIZE)
+
+#define FLOATING_VECTOR_LOC(vector, index) \
+ ((double *) (VECTOR_LOC ((vector), ((index) * FLONUM_SIZE))))
+
+#define FLOATING_VECTOR_REF(vector, index) \
+ (* (FLOATING_VECTOR_LOC ((vector), (index))))
+
+#define FLOATING_VECTOR_REF(vector, index, x) \
+ (* (FLOATING_VECTOR_LOC ((vector), (index)))) = ((double) (x))
+
/* Numeric Type Conversions */
#define BIGNUM_TO_FIXNUM_P(bignum) \
/* -*-C-*-
-$Id: object.h,v 9.43 1993/10/14 19:19:02 gjr Exp $
+$Id: object.h,v 9.44 1993/12/05 06:07:52 cph Exp $
Copyright (c) 1987-1993 Massachusetts Institute of Technology
/* Flonum Operations */
+#define FLONUM_SIZE (BYTES_TO_WORDS (sizeof (double)))
+
#define FLONUM_TO_DOUBLE(object) \
(* ((double *) (MEMORY_LOC ((object), 1))))
#define FLONUM_TRUNCATE(object) \
(double_to_flonum (double_truncate (FLONUM_TO_DOUBLE (object))))
+/* Flonum-vector Operations */
+
+#define FLOATING_VECTOR_LENGTH(vector) \
+ ((VECTOR_LENGTH (vector)) / FLONUM_SIZE)
+
+#define FLOATING_VECTOR_LOC(vector, index) \
+ ((double *) (VECTOR_LOC ((vector), ((index) * FLONUM_SIZE))))
+
+#define FLOATING_VECTOR_REF(vector, index) \
+ (* (FLOATING_VECTOR_LOC ((vector), (index))))
+
+#define FLOATING_VECTOR_REF(vector, index, x) \
+ (* (FLOATING_VECTOR_LOC ((vector), (index)))) = ((double) (x))
+
/* Numeric Type Conversions */
#define BIGNUM_TO_FIXNUM_P(bignum) \