I use a slightly different DO macro. For example,
DO(count(v)) v[i]=i;
DO(3,4) a+=i*10+j;
DO(3,4,5) a[i][k]+=b[i][j]*c[j][k];
Where i,j,k are first, second and third indices. So i in the last example takes values 0..2, for each i value j takes values 0..3 and for each j value k takes values 0..4.