here's the C without the `lookup` helper: /* myloop123 in base64e/scheme in k203 in k199 in k196 in k193 in k190 */ static C_word f_220(C_word t0,C_word t1,C_word t2){ C_word tmp; C_word t3; C_word t4; C_word t5; C_word t6; C_word t7; C_word t8; C_word t9; C_word t10; C_word t11; C_word t12; C_word t13; C_word t14; C_word t15; C_word t16; C_word t17; C_word t18; C_word t19; C_word t20; C_word t21; C_word t22; C_word t23; C_word t24; C_word t25; C_word t26; C_word t27; C_word t28; C_word t29; C_word t30; C_word t31; C_word t32; C_word t33; C_word t34; C_word t35; C_word t36; loop:{} if(C_truep(C_fixnum_less_or_equal_p(t1,((C_word*)t0)[2]))){ t3=C_u_fixnum_plus(t1,C_fix(0)); t4=C_u_i_u8vector_ref(((C_word*)t0)[3],t3); t5=C_fixnum_shift_left(t4,C_fix(16)); t6=C_u_fixnum_plus(t1,C_fix(1)); t7=C_u_i_u8vector_ref(((C_word*)t0)[3],t6); t8=C_fixnum_shift_left(t7,C_fix(8)); t9=C_u_fixnum_plus(t1,C_fix(2)); t10=C_u_i_u8vector_ref(((C_word*)t0)[3],t9); t11=C_fixnum_shift_left(t10,C_fix(0)); t12=C_u_fixnum_plus(t8,t11); t13=C_u_fixnum_plus(t5,t12); t14=C_u_fixnum_plus(t2,C_fix(0)); t15=C_fixnum_shift_right(t13,C_fix(-18)); t16=C_u_fixnum_and(t15,C_fix(63)); t17=C_u_i_u8vector_ref(((C_word*)t0)[4],t16); t18=C_u_i_u8vector_set(((C_word*)t0)[5],t14,t17); t19=C_u_fixnum_plus(t2,C_fix(1)); t20=C_fixnum_shift_right(t13,C_fix(-12)); t21=C_u_fixnum_and(t20,C_fix(63)); t22=C_u_i_u8vector_ref(((C_word*)t0)[4],t21); t23=C_u_i_u8vector_set(((C_word*)t0)[5],t19,t22); t24=C_u_fixnum_plus(t2,C_fix(2)); t25=C_fixnum_shift_right(t13,C_fix(-6)); t26=C_u_fixnum_and(t25,C_fix(63)); t27=C_u_i_u8vector_ref(((C_word*)t0)[4],t26); t28=C_u_i_u8vector_set(((C_word*)t0)[5],t24,t27); t29=C_u_fixnum_plus(t2,C_fix(3)); t30=C_fixnum_shift_right(t13,C_fix(0)); t31=C_u_fixnum_and(t30,C_fix(63)); t32=C_u_i_u8vector_ref(((C_word*)t0)[4],t31); t33=C_u_i_u8vector_set(((C_word*)t0)[5],t29,t32); t35=C_u_fixnum_plus(t1,C_fix(3)); t36=C_u_fixnum_plus(t2,C_fix(4)); t1=t35; t2=t36; goto loop;} else{ return(t2);}} nice and tight. with the lookup, an extra C call is introduced: static C_word f_220(C_word t0,C_word t1,C_word t2){ C_word tmp; C_word t3; C_word t4; C_word t5; C_word t6; C_word t7; C_word t8; C_word t9; C_word t10; C_word t11; C_word t12; C_word t13; C_word t14; C_word t15; C_word t16; C_word t17; C_word t18; C_word t19; C_word t20; C_word t21; C_word t22; C_word t23; C_word t24; C_word t25; C_word t26; C_word t27; C_word t28; C_word t29; C_word t30; C_word t31; C_word t32; loop:{} if(C_truep(C_fixnum_less_or_equal_p(t1,((C_word*)t0)[2]))){ t3=C_u_fixnum_plus(t1,C_fix(0)); t4=C_u_i_u8vector_ref(((C_word*)t0)[3],t3); t5=C_fixnum_shift_left(t4,C_fix(16)); t6=C_u_fixnum_plus(t1,C_fix(1)); t7=C_u_i_u8vector_ref(((C_word*)t0)[3],t6); t8=C_fixnum_shift_left(t7,C_fix(8)); t9=C_u_fixnum_plus(t1,C_fix(2)); t10=C_u_i_u8vector_ref(((C_word*)t0)[3],t9); t11=C_fixnum_shift_left(t10,C_fix(0)); t12=C_u_fixnum_plus(t8,t11); t13=C_u_fixnum_plus(t5,t12); t14=C_u_fixnum_plus(t2,C_fix(0)); t15=C_fixnum_shift_right(t13,C_fix(-18)); t16=( /* /home/klm/prj/chicken-base64/bench64.scm:22: lookup */ f_206(((C_word*)t0)[4],C_u_fixnum_and(t15,C_fix(63))) ); t17=C_u_i_u8vector_set(((C_word*)t0)[5],t14,t16); t18=C_u_fixnum_plus(t2,C_fix(1)); t19=C_fixnum_shift_right(t13,C_fix(-12)); t20=( /* /home/klm/prj/chicken-base64/bench64.scm:23: lookup */ f_206(((C_word*)t0)[4],C_u_fixnum_and(t19,C_fix(63))) ); t21=C_u_i_u8vector_set(((C_word*)t0)[5],t18,t20); t22=C_u_fixnum_plus(t2,C_fix(2)); t23=C_fixnum_shift_right(t13,C_fix(-6)); t24=( /* /home/klm/prj/chicken-base64/bench64.scm:24: lookup */ f_206(((C_word*)t0)[4],C_u_fixnum_and(t23,C_fix(63))) ); t25=C_u_i_u8vector_set(((C_word*)t0)[5],t22,t24); t26=C_u_fixnum_plus(t2,C_fix(3)); t27=C_fixnum_shift_right(t13,C_fix(0)); t28=( /* /home/klm/prj/chicken-base64/bench64.scm:25: lookup */ f_206(((C_word*)t0)[4],C_u_fixnum_and(t27,C_fix(63))) ); t29=C_u_i_u8vector_set(((C_word*)t0)[5],t26,t28); t31=C_u_fixnum_plus(t1,C_fix(3)); t32=C_u_fixnum_plus(t2,C_fix(4)); t1=t31; t2=t32; goto loop;} else{ return(t2);}} where /* lookup in k203 in k199 in k196 in k193 in k190 */ static C_word f_206(C_word t0,C_word t1){ C_word tmp; C_word t2;{} return(C_u_i_u8vector_ref(((C_word*)t0)[2],t1));} this probably causes the 10-30% performance degrade. why isn't the C compiler able to inline this, though? and why isn't CHICKEN?