On Fri, 18 Mar 2011 14:42:04 -0400
Matthew Mondor <[email protected]> wrote:
> When I can, I'll then redo these tests on both SBCL and ECL using
> various safety levels to ensure that at level three boundary checks
> always be performed, and to list where at level 0 optimization could be
> improved.
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.
I'm not sure if all levels for all functions yield ideal results,
but this allows to easily compare them...
--
Matt
(defmacro gen (function)
`(progn
,@(loop
for i from 0 to 3
collect
`(defun ,(intern (format nil "~A-~A" function i)) ()
(declare (optimize (safety ,i) (speed 3) (debug 0)))
(,function #(#\A #\B #\C) 4)))))
(gen aref)
(gen svref)
(gen char)
(gen schar)
(gen elt)
/* Compiler: ECL 11.1.1 */
/* Date: 2011/3/18 15:17 (yyyy/mm/dd) */
/* Machine: NetBSD 5.1_STABLE i386 */
/* Source: /tmp/index.lisp */
#include <ecl/ecl-cmp.h>
#include "index.h"
/* local function GEN */
/* optimize speed 3, debug 1, space 0, safety 1 */
static cl_object
LC1gen(cl_object V1, cl_object V2)
{
VT2 VLEX2 CLSR2 STCK2
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
TTL:
{
cl_object V3; /* FUNCTION */
if ((CDR(V1)) == Cnil) {
goto L3;
}
V3 = CADR(V1);
goto L1;
L3: ;
V3 = si_dm_too_few_arguments(0) /* DM-TOO-FEW-ARGUMENTS
*/ ;
goto L1;
L1: ;
(void) si_check_arg_length(2, V1, MAKE_FIXNUM(2)) /*
CHECK-ARG-LENGTH */ ;
{
cl_fixnum V4; /* I */
V4 = 0;
{
cl_object V5;
cl_object V6;
V5 = ecl_list1(Cnil);
V6 = V5;
L11: ;
T1 = V6;
T2 = cl_format(4, Cnil, VV[0], V3,
MAKE_FIXNUM(V4)) /* FORMAT */ ;
T3 = cl_intern(1, T2) /* INTERN
*/ ;
T4 = cl_list(2, ECL_SYM("SAFETY", 732),
MAKE_FIXNUM(V4)) /* LIST */ ;
T5 = cl_listX(3, ECL_SYM("OPTIMIZE",
611), T4, VV[1]) /* LIST* */ ;
T6 = cl_list(2, ECL_SYM("DECLARE",
272), T5) /* LIST */ ;
T7 = CONS(V3, VV[2]);
T8 = cl_list(5, ECL_SYM("DEFUN", 287),
T3, Cnil, T6, T7) /* LIST */ ;
V6 = ecl_list1(T8);
ECL_CONS_CDR(T1) = V6;
V4 = (V4) + 1;
if (!((V4) > (3))) {
goto L19;
}
goto L12;
L19: ;
goto L17;
L17: ;
goto L11;
L12: ;
T0 = CDR(V5);
goto L6;
}
}
L6: ;
value0 = CONS(ECL_SYM("PROGN", 669), T0);
cl_env_copy->nvalues = 1;
return value0;
}
}
}
/* function definition for AREF-0 */
/* optimize speed 3, debug 0, space 0, safety 0 */
static cl_object
L2aref_0()
{
VT3 VLEX3 CLSR3 STCK3
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
TTL:
value0 = ecl_aref_unsafe(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
/* function definition for AREF-1 */
/* optimize speed 3, debug 0, space 0, safety 1 */
static cl_object
L3aref_1()
{
VT4 VLEX4 CLSR4 STCK4
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
TTL:
if (ecl_unlikely(!ECL_VECTORP(VV[4])))
FEtype_error_vector(VV[4]);
if (ecl_unlikely((4) >= (VV[4])->vector.dim))
FEwrong_index(Cnil, VV[4], -1, MAKE_FIXNUM(4),
(VV[4])->vector.dim);
value0 = ecl_aref_unsafe(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for AREF-2 */
/* optimize speed 3, debug 0, space 0, safety 2 */
static cl_object
L4aref_2()
{
VT5 VLEX5 CLSR5 STCK5
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
if (ecl_unlikely(!ECL_VECTORP(VV[4])))
FEtype_error_vector(VV[4]);
if (ecl_unlikely((4) >= (VV[4])->vector.dim))
FEwrong_index(Cnil, VV[4], -1, MAKE_FIXNUM(4),
(VV[4])->vector.dim);
value0 = ecl_aref_unsafe(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for AREF-3 */
/* optimize speed 3, debug 0, space 0, safety 3 */
static cl_object
L5aref_3()
{
VT6 VLEX6 CLSR6 STCK6
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
if (ecl_unlikely(!ECL_VECTORP(VV[4])))
FEtype_error_vector(VV[4]);
if (ecl_unlikely((4) >= (VV[4])->vector.dim))
FEwrong_index(Cnil, VV[4], -1, MAKE_FIXNUM(4),
(VV[4])->vector.dim);
value0 = ecl_aref_unsafe(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for SVREF-0 */
/* optimize speed 3, debug 0, space 0, safety 0 */
static cl_object
L6svref_0()
{
VT7 VLEX7 CLSR7 STCK7
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
TTL:
value0 = (VV[4])->vector.self.t[4];
cl_env_copy->nvalues = 1;
return value0;
}
/* function definition for SVREF-1 */
/* optimize speed 3, debug 0, space 0, safety 1 */
static cl_object
L7svref_1()
{
VT8 VLEX8 CLSR8 STCK8
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
TTL:
value0 = (VV[4])->vector.self.t[4];
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for SVREF-2 */
/* optimize speed 3, debug 0, space 0, safety 2 */
static cl_object
L8svref_2()
{
VT9 VLEX9 CLSR9 STCK9
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = ecl_aref1(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for SVREF-3 */
/* optimize speed 3, debug 0, space 0, safety 3 */
static cl_object
L9svref_3()
{
VT10 VLEX10 CLSR10 STCK10
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = ecl_aref1(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for CHAR-0 */
/* optimize speed 3, debug 0, space 0, safety 0 */
static cl_object
L10char_0()
{
VT11 VLEX11 CLSR11 STCK11
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
/* function definition for CHAR-1 */
/* optimize speed 3, debug 0, space 0, safety 1 */
static cl_object
L11char_1()
{
VT12 VLEX12 CLSR12 STCK12
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for CHAR-2 */
/* optimize speed 3, debug 0, space 0, safety 2 */
static cl_object
L12char_2()
{
VT13 VLEX13 CLSR13 STCK13
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for CHAR-3 */
/* optimize speed 3, debug 0, space 0, safety 3 */
static cl_object
L13char_3()
{
VT14 VLEX14 CLSR14 STCK14
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for SCHAR-0 */
/* optimize speed 3, debug 0, space 0, safety 0 */
static cl_object
L14schar_0()
{
VT15 VLEX15 CLSR15 STCK15
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
/* function definition for SCHAR-1 */
/* optimize speed 3, debug 0, space 0, safety 1 */
static cl_object
L15schar_1()
{
VT16 VLEX16 CLSR16 STCK16
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for SCHAR-2 */
/* optimize speed 3, debug 0, space 0, safety 2 */
static cl_object
L16schar_2()
{
VT17 VLEX17 CLSR17 STCK17
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for SCHAR-3 */
/* optimize speed 3, debug 0, space 0, safety 3 */
static cl_object
L17schar_3()
{
VT18 VLEX18 CLSR18 STCK18
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = CODE_CHAR(ecl_char(VV[4], 4));
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for ELT-0 */
/* optimize speed 3, debug 0, space 0, safety 0 */
static cl_object
L18elt_0()
{
VT19 VLEX19 CLSR19 STCK19
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
TTL:
value0 = ecl_elt(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
/* function definition for ELT-1 */
/* optimize speed 3, debug 0, space 0, safety 1 */
static cl_object
L19elt_1()
{
VT20 VLEX20 CLSR20 STCK20
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
{
TTL:
value0 = ecl_elt(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for ELT-2 */
/* optimize speed 3, debug 0, space 0, safety 2 */
static cl_object
L20elt_2()
{
VT21 VLEX21 CLSR21 STCK21
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = ecl_elt(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
/* function definition for ELT-3 */
/* optimize speed 3, debug 0, space 0, safety 3 */
static cl_object
L21elt_3()
{
VT22 VLEX22 CLSR22 STCK22
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
ecl_cs_check(cl_env_copy, value0);
{
TTL:
value0 = ecl_elt(VV[4], 4);
cl_env_copy->nvalues = 1;
return value0;
}
}
#include "index.data"
#ifdef __cplusplus
extern "C"
#endif
ECL_DLLEXPORT void
init_fas_CODE(cl_object flag)
{
VT1 VLEX1 CLSR1 STCK1
const cl_env_ptr cl_env_copy = ecl_process_env();
cl_object value0;
cl_object *VVtemp;
if (!FIXNUMP(flag)) {
Cblock = flag;
#ifndef ECL_DYNAMIC_VV
flag->cblock.data = VV;
#endif
flag->cblock.data_size = VM;
flag->cblock.temp_data_size = VMtemp;
flag->cblock.data_text = compiler_data_text;
flag->cblock.data_text_size = compiler_data_text_size;
flag->cblock.cfuns_size = compiler_cfuns_size;
flag->cblock.cfuns = compiler_cfuns;
flag->cblock.source =
make_constant_base_string("/tmp/index.lisp");
return;
}
#ifdef ECL_DYNAMIC_VV
VV = Cblock->cblock.data;
#endif
Cblock->cblock.data_text = "@EcLtAg:init_fas_CODE@";
VVtemp = Cblock->cblock.temp_data;
ecl_cmp_defmacro(VV[25]);
ecl_cmp_defun(VV[26]);
ecl_cmp_defun(VV[27]);
ecl_cmp_defun(VV[28]);
ecl_cmp_defun(VV[29]);
ecl_cmp_defun(VV[30]);
ecl_cmp_defun(VV[31]);
ecl_cmp_defun(VV[32]);
ecl_cmp_defun(VV[33]);
ecl_cmp_defun(VV[34]);
ecl_cmp_defun(VV[35]);
ecl_cmp_defun(VV[36]);
ecl_cmp_defun(VV[37]);
ecl_cmp_defun(VV[38]);
ecl_cmp_defun(VV[39]);
ecl_cmp_defun(VV[40]);
ecl_cmp_defun(VV[41]);
ecl_cmp_defun(VV[42]);
ecl_cmp_defun(VV[43]);
ecl_cmp_defun(VV[44]);
ecl_cmp_defun(VV[45]);
}
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Ecls-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ecls-list