[Ecls-list] Type propagation
Alexander Gavrilov
angavrilov at gmail.com
Thu Aug 12 14:54:45 UTC 2010
On Thu, Aug 12, 2010 at 2:27 AM, Juan Jose Garcia-Ripoll
<juanjose.garciaripoll at googlemail.com> wrote:
> On Wed, Aug 11, 2010 at 5:29 PM, Alexander Gavrilov <angavrilov at gmail.com>
> wrote:
>>
>> Hi, I've finally got around to this, and after some investigation
>> implemented it using the static constant facility in cmpwt.lsp
>> instead:
Today I added definitions for a number of SSE intrinsic functions:
http://github.com/angavrilov/ecl-sse/blob/f9436efbf6b72544129d493a8342208392cf3354/contrib/sse/sse.lsp
However, when I try to use them, ECL generates correct code for SSE
operations, but fixnums are for some reason not handled inline:
(declaim (ftype (function ((array single-float) (array single-float))
t) add-floats))
(defun add-floats (arr1 arr2)
(declare (optimize (speed 3) (safety 1)))
(loop for i fixnum from 0 below (- (min (array-total-size arr1)
(array-total-size arr2))
3) by 4
do (setf (sse:row-major-aref-ps arr1 i)
(sse:add-ps (sse:row-major-aref-ps arr1 i)
(sse:row-major-aref-ps arr2 i)))))
transforms to:
/* function definition for ADD-FLOATS */
/* optimize speed 3, debug 3, space 0, safety 1 */
static cl_object L2add_floats(cl_object V1, cl_object V2)
{ VT3 VLEX3 CLSR3 STCK3
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
{
ecl_ihs_push(cl_env_copy,&ihs,VV[2],_ecl_debug_env);
TTL:
T0= cl_typep(2,V1,VV[0]) /* TYPEP */;
if (ecl_unlikely(!((T0)!=Cnil)))
FEwrong_type_argument(VV[0],V1);
T0= cl_typep(2,V2,VV[0]) /* TYPEP */;
if (ecl_unlikely(!((T0)!=Cnil)))
FEwrong_type_argument(VV[0],V2);
{cl_fixnum V3; /* I */
cl_fixnum V4;
V3= 0;
{cl_fixnum V5;
V5= ((V1)->array.dim);
{cl_fixnum V6;
V6= ((V2)->array.dim);
{cl_fixnum V7;
V7= (V5)<=(V6)?V5:V6;
V4= ecl_to_fixnum(ecl_minus(MAKE_FIXNUM(V7),MAKE_FIXNUM(3)));}}}
L8:;
if(!((V3)>=(V4))){
goto L12;}
goto L9;
L12:;
goto L10;
L10:;
{__m128 V5;
V5= _mm_loadu_ps((__m128*)(&(V1)->array.self.sf[V3]));
{__m128 V6;
V6= _mm_loadu_ps((__m128*)(&(V2)->array.self.sf[V3]));
{__m128 V7;
V7= _mm_add_ps(V5,V6);
(_mm_storeu_ps((__m128*)(&(V1)->array.self.sf[V3]),V7),V7);}}}
V3= ecl_to_fixnum(ecl_plus(MAKE_FIXNUM(V3),MAKE_FIXNUM(4)));
goto L8;
L9:;
value0=Cnil; cl_env_copy->nvalues=1;
ecl_ihs_pop(cl_env_copy);
return value0;
}
}
}}
More information about the ecl-devel
mailing list