[Ecls-list] AREF/SVREF/CHAR/SCHAR/ELT and signals
Matthew Mondor
mm_lists at pulsar-zone.net
Sat Mar 19 00:57:34 UTC 2011
On Fri, 18 Mar 2011 15:26:26 -0400
Matthew Mondor <mm_lists at pulsar-zone.net> wrote:
> Attached is the test CL code and the resulting C code with ECL.
> So for the SVREF case indeed 0-1 safety levels allow better
> optimization, and ecl_aref1() is used at higher levels.
When I started looking at the array implementation, it was because I
was trying to optimize a prototype application which initially used
lists a lot. An early test replacing a list by an array in a
particular scenario didn't seem impressive, but after more tests I can
say that indeed a significant performance gain can be achieved with
arrays.
The following example function demonstrates that ECL can generate nice
code even with AREF:
(defun test ()
(declare (optimize (safety 0) (speed 3)))
(let ((a (make-array 4096
:element-type 'ext::integer16
:fill-pointer nil
:adjustable nil)))
(loop
for i of-type fixnum from 0 below 4096
do
(setf (aref a i) i))
a))
static cl_object
L1test()
{
VT2 VLEX2 CLSR2 STCK2
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
TTL:
{
cl_object V1; /* A */
V1 = si_make_vector(ECL_SYM("INTEGER16", 1312), MAKE_FIXNUM(4096), Cnil, Cnil, Cnil, MAKE_FIXNUM(0)) /* MAKE-VECTOR */ ;
{
cl_fixnum V2; /* I */
V2 = 0;
L5: ;
(V1)->vector.self.i16[V2] = V2;
V2 = (V2) + 1;
if (!((V2) >= (4096))) {
goto L12;
}
goto L6;
L12: ;
goto L10;
L10: ;
goto L5;
L6: ;
goto L2;
}
L2: ;
value0 = V1;
cl_env_copy->nvalues = 1;
return value0;
}
}
00000770 <L1test>:
770: 55 push %ebp
771: b9 03 00 00 00 mov $0x3,%ecx
776: 89 e5 mov %esp,%ebp
778: ba 01 00 00 00 mov $0x1,%edx
77d: 56 push %esi
77e: be 01 00 00 00 mov $0x1,%esi
783: 53 push %ebx
784: e8 6c 00 00 00 call 7f5 <__i686.get_pc_thunk.bx>
789: 81 c3 33 12 00 00 add $0x1233,%ebx
78f: 83 ec 20 sub $0x20,%esp
792: 89 4c 24 14 mov %ecx,0x14(%esp)
796: b9 01 00 00 00 mov $0x1,%ecx
79b: 89 54 24 10 mov %edx,0x10(%esp)
79f: ba 03 40 00 00 mov $0x4003,%edx
7a4: 89 74 24 0c mov %esi,0xc(%esp)
7a8: 89 54 24 04 mov %edx,0x4(%esp)
7ac: 89 4c 24 08 mov %ecx,0x8(%esp)
7b0: 8b 83 f4 ff ff ff mov 0xfffffff4(%ebx),%eax
7b6: 05 80 8f 00 00 add $0x8f80,%eax
7bb: 89 04 24 mov %eax,(%esp)
7be: e8 cd fd ff ff call 590 <si_make_vector at plt>
7c3: 31 d2 xor %edx,%edx
7c5: 89 c6 mov %eax,%esi
7c7: 89 f6 mov %esi,%esi
7c9: 8d bc 27 00 00 00 00 lea 0x0(%edi),%edi
7d0: 8b 46 10 mov 0x10(%esi),%eax
7d3: 66 89 14 50 mov %dx,(%eax,%edx,2)
7d7: 42 inc %edx
7d8: 81 fa 00 10 00 00 cmp $0x1000,%edx
7de: 75 f0 jne 7d0 <L1test+0x60>
7e0: e8 db fd ff ff call 5c0 <ecl_process_env at plt>
7e5: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
7ec: 83 c4 20 add $0x20,%esp
7ef: 89 f0 mov %esi,%eax
7f1: 5b pop %ebx
7f2: 5e pop %esi
7f3: 5d pop %ebp
7f4: c3 ret
Thanks for making this possible,
--
Matt
More information about the ecl-devel
mailing list