[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