define(`forloop', `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')') define(`_forloop', `$4`'ifelse($1, `$3', , `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')dnl define(`unroll',`define(`var',$1)dnl define(`tempvar',$1_$3)dnl for ( tempvar = 0; tempvar+$3 < $2; tempvar += $3 ) { forloop(`j',0,decr($3),` pushdef($1,`tempvar'+`j')$4;popdef($1) ') } undefine(`$1')dnl for ( var = tempvar; var < $2; var++ ) $4;')dnl unroll(`i',`n',4,`sum[i] = a[i]+b[i]')dnl