# HG changeset patch # User Claus Gittinger # Date 1451339637 -3600 # Node ID 6ac2cb393fd7f2935d13a60aa86a76d5b8f1a85e # Parent 52150e74c10993e8570e691faceae85d8109c21f *** empty log message *** diff -r 52150e74c109 -r 6ac2cb393fd7 FloatArray.st --- a/FloatArray.st Wed Dec 23 10:52:10 2015 +0100 +++ b/FloatArray.st Mon Dec 28 22:53:57 2015 +0100 @@ -42,17 +42,17 @@ " FloatArrays store floats (and nothing else). They have been added to support heavy duty number crunching and - data exchange with openGL frameworks and other mass data libraries. + data exchange with openGL frameworks and other mass data libraries. See documentation in DoubleArray for more information. [memory requirements:] - OBJ-HEADER + (size * float-size) + OBJ-HEADER + (size * float-size) [See also:] - DoubleArray Array + DoubleArray Array [author:] - Claus Gittinger + Claus Gittinger " ! ! @@ -142,38 +142,38 @@ replaceFrom:start to:stop with:aCollection startingAt:replStart %{ if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) - && __isFloats(aCollection) - && (__ClassInstPtr(__qClass(aCollection))->c_ninstvars == __mkSmallInteger(0)) - && __bothSmallInteger(start, stop) - && __isSmallInteger(replStart) + && __isFloats(aCollection) + && (__ClassInstPtr(__qClass(aCollection))->c_ninstvars == __mkSmallInteger(0)) + && __bothSmallInteger(start, stop) + && __isSmallInteger(replStart) ) { - INT __start = __intVal(start) - 1; - INT __stop = __intVal(stop) - 1 ; - INT __replStart = __intVal(replStart) - 1 ; + INT __start = __intVal(start) - 1; + INT __stop = __intVal(stop) - 1 ; + INT __replStart = __intVal(replStart) - 1 ; - if (__stop >= __start) { - INT __sz = __floatArraySize(self); - INT __otherSz = __floatArraySize(aCollection); - INT __replStop = __replStart + (__stop-__start); + if (__stop >= __start) { + INT __sz = __floatArraySize(self); + INT __otherSz = __floatArraySize(aCollection); + INT __replStop = __replStart + (__stop-__start); - if (((unsigned INT)__start < __sz) - && ((unsigned INT)__stop < __sz) - && ((unsigned INT)__replStart < __otherSz) - && ((unsigned INT)__replStop < __otherSz)) { - INT __n = __stop - __start + 1; + if (((unsigned INT)__start < __sz) + && ((unsigned INT)__stop < __sz) + && ((unsigned INT)__replStart < __otherSz) + && ((unsigned INT)__replStop < __otherSz)) { + INT __n = __stop - __start + 1; - if (aCollection == self) { - memmove(&(__FloatArrayInstPtr(self)->f_element[__start]), - &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]), - sizeof(float) * __n); - } else { - memcpy(&(__FloatArrayInstPtr(self)->f_element[__start]), - &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]), - sizeof(float) * __n); - } - RETURN(self); - } - } + if (aCollection == self) { + memmove(&(__FloatArrayInstPtr(self)->f_element[__start]), + &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]), + sizeof(float) * __n); + } else { + memcpy(&(__FloatArrayInstPtr(self)->f_element[__start]), + &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]), + sizeof(float) * __n); + } + RETURN(self); + } + } } %}. ^ super replaceFrom:start to:stop with:aCollection startingAt:replStart @@ -194,27 +194,27 @@ %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { - INT _sz = __floatArraySize(self); - INT i; - float *_p = __FloatArrayInstPtr(self)->f_element; - float prev_p; + INT _sz = __floatArraySize(self); + INT i; + float *_p = __FloatArrayInstPtr(self)->f_element; + float prev_p; - if (_sz > 0) { - /* how about inline-mmx-asm for this ... */ - prev_p = _p[0]; - for (i=1; i<_sz; i++) { - float next_p = _p[i]; + if (_sz > 0) { + /* how about inline-mmx-asm for this ... */ + prev_p = _p[0]; + for (i=1; i<_sz; i++) { + float next_p = _p[i]; - if (prev_p < 0) { - _p[i-1] = -prev_p; - } - prev_p = next_p; - } - if (prev_p < 0) { - _p[i-1] = -prev_p; - } - } - RETURN (self); + if (prev_p < 0) { + _p[i-1] = -prev_p; + } + prev_p = next_p; + } + if (prev_p < 0) { + _p[i-1] = -prev_p; + } + } + RETURN (self); } %}. super primAbs @@ -238,29 +238,29 @@ if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) && __isFloats(floatArray) && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) { - INT _sz1 = __floatArraySize(self); - INT _sz2 = __floatArraySize(floatArray); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; + INT _sz1 = __floatArraySize(self); + INT _sz2 = __floatArraySize(floatArray); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; - if (_sz1 > 0) { - if (_sz2 >= _sz1) { - /* how about inline-mmx-asm for this ... */ - float prev_p1 = _p1[0]; - float prev_p2 = _p2[0]; + if (_sz1 > 0) { + if (_sz2 >= _sz1) { + /* how about inline-mmx-asm for this ... */ + float prev_p1 = _p1[0]; + float prev_p2 = _p2[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - float next_p2 = _p2[i]; - _p1[i-1] = prev_p1 + prev_p2; - prev_p1 = next_p1; - prev_p2 = next_p2; - } - _p1[i-1] = prev_p1 + prev_p2; - } - } - RETURN (self); + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + float next_p2 = _p2[i]; + _p1[i-1] = prev_p1 + prev_p2; + prev_p1 = next_p1; + prev_p2 = next_p2; + } + _p1[i-1] = prev_p1 + prev_p2; + } + } + RETURN (self); } %}. super primAddArray:floatArray @@ -280,32 +280,32 @@ %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { - INT _sz1 = __floatArraySize(self); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float v; - float prev_p1; + INT _sz1 = __floatArraySize(self); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float v; + float prev_p1; - if (_sz1 > 0) { - if (__isFloat(aScalar)) { - v = (float)(__floatVal(aScalar)); - } else if (__isShortFloat(aScalar)) { - v = __shortFloatVal(aScalar); - } else if (__isSmallInteger(aScalar)) { - v = (float)(__intVal(aScalar)); - } else - goto badArg; + if (_sz1 > 0) { + if (__isFloat(aScalar)) { + v = (float)(__floatVal(aScalar)); + } else if (__isShortFloat(aScalar)) { + v = __shortFloatVal(aScalar); + } else if (__isSmallInteger(aScalar)) { + v = (float)(__intVal(aScalar)); + } else + goto badArg; - /* how about inline-mmx-asm for this ... */ - prev_p1 = _p1[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - _p1[i-1] = prev_p1 + v; - prev_p1 = next_p1; - } - _p1[i-1] = prev_p1 + v; - } - RETURN (self); + /* how about inline-mmx-asm for this ... */ + prev_p1 = _p1[0]; + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + _p1[i-1] = prev_p1 + v; + prev_p1 = next_p1; + } + _p1[i-1] = prev_p1 + v; + } + RETURN (self); } badArg: ; %}. @@ -332,29 +332,29 @@ if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) && __isFloats(floatArray) && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) { - INT _sz1 = __floatArraySize(self); - INT _sz2 = __floatArraySize(floatArray); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; + INT _sz1 = __floatArraySize(self); + INT _sz2 = __floatArraySize(floatArray); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; - if (_sz1 > 0) { - if (_sz2 >= _sz1) { - /* how about inline-mmx-asm for this ... */ - float prev_p1 = _p1[0]; - float prev_p2 = _p2[0]; + if (_sz1 > 0) { + if (_sz2 >= _sz1) { + /* how about inline-mmx-asm for this ... */ + float prev_p1 = _p1[0]; + float prev_p2 = _p2[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - float next_p2 = _p2[i]; - _p1[i-1] = prev_p1 / prev_p2; - prev_p1 = next_p1; - prev_p2 = next_p2; - } - _p1[i-1] = prev_p1 / prev_p2; - } - } - RETURN (self); + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + float next_p2 = _p2[i]; + _p1[i-1] = prev_p1 / prev_p2; + prev_p1 = next_p1; + prev_p2 = next_p2; + } + _p1[i-1] = prev_p1 / prev_p2; + } + } + RETURN (self); } %}. super primDivArray: floatArray @@ -376,32 +376,32 @@ %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { - INT _sz1 = __floatArraySize(self); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float v; - float prev_p1; + INT _sz1 = __floatArraySize(self); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float v; + float prev_p1; - if (_sz1 > 0) { - if (__isFloat(aScalar)) { - v = (float)(__floatVal(aScalar)); - } else if (__isShortFloat(aScalar)) { - v = __shortFloatVal(aScalar); - } else if (__isSmallInteger(aScalar)) { - v = (float)(__intVal(aScalar)); - } else - goto badArg; + if (_sz1 > 0) { + if (__isFloat(aScalar)) { + v = (float)(__floatVal(aScalar)); + } else if (__isShortFloat(aScalar)) { + v = __shortFloatVal(aScalar); + } else if (__isSmallInteger(aScalar)) { + v = (float)(__intVal(aScalar)); + } else + goto badArg; - /* how about inline-mmx-asm for this ... */ - prev_p1 = _p1[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - _p1[i-1] = prev_p1 / v; - prev_p1 = next_p1; - } - _p1[i-1] = prev_p1 / v; - } - RETURN (self); + /* how about inline-mmx-asm for this ... */ + prev_p1 = _p1[0]; + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + _p1[i-1] = prev_p1 / v; + prev_p1 = next_p1; + } + _p1[i-1] = prev_p1 / v; + } + RETURN (self); } badArg: ; %}. @@ -430,28 +430,28 @@ if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) && __isFloats(floatArray) && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) { - INT _sz1 = __floatArraySize(self); - INT _sz2 = __floatArraySize(floatArray); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; + INT _sz1 = __floatArraySize(self); + INT _sz2 = __floatArraySize(floatArray); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; - if (_sz1 > 0) { - if (_sz2 >= _sz1) { - float prev_p1 = _p1[0]; - float prev_p2 = _p2[0]; + if (_sz1 > 0) { + if (_sz2 >= _sz1) { + float prev_p1 = _p1[0]; + float prev_p2 = _p2[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - float next_p2 = _p2[i]; - _p1[i-1] = prev_p1 * prev_p2; - prev_p1 = next_p1; - prev_p2 = next_p2; - } - _p1[i-1] = prev_p1 * prev_p2; - } - } - RETURN (self); + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + float next_p2 = _p2[i]; + _p1[i-1] = prev_p1 * prev_p2; + prev_p1 = next_p1; + prev_p2 = next_p2; + } + _p1[i-1] = prev_p1 * prev_p2; + } + } + RETURN (self); } %}. super primMulArray: floatArray @@ -471,32 +471,32 @@ %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { - INT _sz1 = __floatArraySize(self); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float v; - float prev_p1; + INT _sz1 = __floatArraySize(self); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float v; + float prev_p1; - if (_sz1 > 0) { - if (__isFloat(aScalar)) { - v = (float)(__floatVal(aScalar)); - } else if (__isShortFloat(aScalar)) { - v = __shortFloatVal(aScalar); - } else if (__isSmallInteger(aScalar)) { - v = (float)(__intVal(aScalar)); - } else - goto badArg; + if (_sz1 > 0) { + if (__isFloat(aScalar)) { + v = (float)(__floatVal(aScalar)); + } else if (__isShortFloat(aScalar)) { + v = __shortFloatVal(aScalar); + } else if (__isSmallInteger(aScalar)) { + v = (float)(__intVal(aScalar)); + } else + goto badArg; - /* how about inline-mmx-asm for this ... */ - prev_p1 = _p1[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - _p1[i-1] = prev_p1 * v; - prev_p1 = next_p1; - } - _p1[i-1] = prev_p1 * v; - } - RETURN (self); + /* how about inline-mmx-asm for this ... */ + prev_p1 = _p1[0]; + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + _p1[i-1] = prev_p1 * v; + prev_p1 = next_p1; + } + _p1[i-1] = prev_p1 * v; + } + RETURN (self); } badArg: ; %}. @@ -520,23 +520,23 @@ %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { - INT _sz = __floatArraySize(self); - INT i; - float *_p = __FloatArrayInstPtr(self)->f_element; - float prev_p; + INT _sz = __floatArraySize(self); + INT i; + float *_p = __FloatArrayInstPtr(self)->f_element; + float prev_p; - if (_sz > 0) { - /* how about inline-mmx-asm for this ... */ - prev_p = _p[0]; - for (i=1; i<_sz; i++) { - float next_p = _p[i]; + if (_sz > 0) { + /* how about inline-mmx-asm for this ... */ + prev_p = _p[0]; + for (i=1; i<_sz; i++) { + float next_p = _p[i]; - _p[i-1] = -prev_p; - prev_p = next_p; - } - _p[i-1] = -prev_p; - } - RETURN (self); + _p[i-1] = -prev_p; + prev_p = next_p; + } + _p[i-1] = -prev_p; + } + RETURN (self); } %}. super primNegated @@ -560,28 +560,28 @@ if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) && __isFloats(floatArray) && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) { - INT _sz1 = __floatArraySize(self); - INT _sz2 = __floatArraySize(floatArray); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; + INT _sz1 = __floatArraySize(self); + INT _sz2 = __floatArraySize(floatArray); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float *_p2 = __FloatArrayInstPtr(floatArray)->f_element; - if (_sz1 > 0) { - if (_sz2 >= _sz1) { - float prev_p1 = _p1[0]; - float prev_p2 = _p2[0]; + if (_sz1 > 0) { + if (_sz2 >= _sz1) { + float prev_p1 = _p1[0]; + float prev_p2 = _p2[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - float next_p2 = _p2[i]; - _p1[i-1] = prev_p1 - prev_p2; - prev_p1 = next_p1; - prev_p2 = next_p2; - } - _p1[i-1] = prev_p1 - prev_p2; - } - } - RETURN (self); + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + float next_p2 = _p2[i]; + _p1[i-1] = prev_p1 - prev_p2; + prev_p1 = next_p1; + prev_p2 = next_p2; + } + _p1[i-1] = prev_p1 - prev_p2; + } + } + RETURN (self); } %}. super primSubtractArray: floatArray @@ -603,32 +603,32 @@ %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { - INT _sz1 = __floatArraySize(self); - INT i; - float *_p1 = __FloatArrayInstPtr(self)->f_element; - float v; - float prev_p1; + INT _sz1 = __floatArraySize(self); + INT i; + float *_p1 = __FloatArrayInstPtr(self)->f_element; + float v; + float prev_p1; - if (_sz1 > 0) { - if (__isFloat(aScalar)) { - v = (float)(__floatVal(aScalar)); - } else if (__isShortFloat(aScalar)) { - v = __shortFloatVal(aScalar); - } else if (__isSmallInteger(aScalar)) { - v = (float)(__intVal(aScalar)); - } else - goto badArg; + if (_sz1 > 0) { + if (__isFloat(aScalar)) { + v = (float)(__floatVal(aScalar)); + } else if (__isShortFloat(aScalar)) { + v = __shortFloatVal(aScalar); + } else if (__isSmallInteger(aScalar)) { + v = (float)(__intVal(aScalar)); + } else + goto badArg; - /* how about inline-mmx-asm for this... ? */ - prev_p1 = _p1[0]; - for (i=1; i<_sz1; i++) { - float next_p1 = _p1[i]; - _p1[i-1] = prev_p1 - v; - prev_p1 = next_p1; - } - _p1[i-1] = prev_p1 - v; - } - RETURN (self); + /* how about inline-mmx-asm for this... ? */ + prev_p1 = _p1[0]; + for (i=1; i<_sz1; i++) { + float next_p1 = _p1[i]; + _p1[i-1] = prev_p1 - v; + prev_p1 = next_p1; + } + _p1[i-1] = prev_p1 - v; + } + RETURN (self); } badArg: ; %}. @@ -707,7 +707,7 @@ ! min - "return the largest element; + "return the smallest element; redefined for speed" %{ if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) { @@ -853,22 +853,22 @@ if (__isFloats(aFloatVector) && (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) && (__ClassInstPtr(__qClass(aFloatVector))->c_ninstvars == __mkSmallInteger(0))) { - INT __mySize = __floatArraySize(self); - INT __otherSize = __floatArraySize(aFloatVector); - float __result = 0.0; + INT __mySize = __floatArraySize(self); + INT __otherSize = __floatArraySize(aFloatVector); + float __result = 0.0; - if (__mySize == __otherSize) { - if (__mySize > 0) { - float *__p1 = __FloatArrayInstPtr(self)->f_element; - float *__p2 = __FloatArrayInstPtr(aFloatVector)->f_element; - INT __i; - /* how about inline-mmx-asm for this ... */ - for (__i=0; __i<__mySize; __i++) { - __result += (__p1[__i] * __p2[__i]); - } - } - RETURN (__MKFLOAT(__result)); - } + if (__mySize == __otherSize) { + if (__mySize > 0) { + float *__p1 = __FloatArrayInstPtr(self)->f_element; + float *__p2 = __FloatArrayInstPtr(aFloatVector)->f_element; + INT __i; + /* how about inline-mmx-asm for this ... */ + for (__i=0; __i<__mySize; __i++) { + __result += (__p1[__i] * __p2[__i]); + } + } + RETURN (__MKFLOAT(__result)); + } } %}. ^ super dot:aFloatVector @@ -877,18 +877,18 @@ |v| v := #(2.0 2.0 1.0) asFloatArray. - v dot:v. + v dot:v. " " |v1 v2| v1 := FloatArray new:10000 withAll:2. - v2 := FloatArray new:10000 withAll:3. + v2 := FloatArray new:10000 withAll:3. Time millisecondsToRun:[ - 10000 timesRepeat:[ - v1 dot:v2. - ] - ] + 10000 timesRepeat:[ + v1 dot:v2. + ] + ] " "Created: / 29-05-2007 / 13:13:39 / cg" @@ -903,4 +903,3 @@ version_CVS ^ '$Header$' ! ! -